第 7 章 使用filter过滤请求
注意
- 了解Filter的使用。
7.1. 批量设置请求编码
package anni; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class EncodingFilter implements Filter {public void init(FilterConfig config) throws ServletException {}public void destroy() {}public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException, ServletException {request.setCharacterEncoding("gb2312");chain.doFilter(request, response);} }
<filter><filter-name>EncodingFilter</filter-name><filter-class>anni.EncodingFilter</filter-class> </filter> <filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>
7.2. 用filter控制用户访问权限
<filter><filter-name>SecurityFilter</filter-name><filter-class>anni.SecurityFilter</filter-class> </filter> <filter-mapping><filter-name>SecurityFilter</filter-name><url-pattern>/admin/*</url-pattern> </filter-mapping>
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;HttpSession session = req.getSession();if (session.getAttribute("username") != null) {chain.doFilter(request, response);} else {res.sendRedirect("../failure.jsp");} }
7.3. filter所谓的特性
7.3.1. 请求映射
- 直接映射一个请求。
<servlet-mapping><servlet-name>ContactServlet</servlet-name><url-pattern>/contact.do</url-pattern> </servlet-mapping>
像第 6.3 节 “使用servlet改写联系簿”中对servlet的映射,只有当请求是/contact.do的时候才会执行ContactServlet。/contact.do?id=1或/contact.do?method=list&id=1的请求也可以匹配到ContactServlet,这是因为根据http规范,请求的路径不包含问号以后的部分。 - 映射一个路径下的所有请求。
<servlet-mapping><servlet-name>EncodingFilter</servlet-name><url-pattern>/*</url-pattern> </servlet-mapping>
像第 7.1 节 “批量设置请求编码”中这样使用星号(*)的形式,可以将某个路径下的所有请求都映射到EncodingFilter过滤器下,如果这个路径下还有子路径,那么子路径下的请求也会被EncodingFilter过滤。所以 /*这种写法就会过滤应用下所有的请求。如果像第 7.2 节 “用filter控制用户访问权限”中那样把映射配置成/admin/*,就会只处理/admin/路径下的请求,不会处理根路径下的/index.jsp和/failure.jsp。需要注意的是,这种写法必须以/开头,写成与绝对路径的形式,即便是映射所有请求也要写成/*,不能简化成*。 - 映射结尾相同的一类请求。
<servlet-mapping><servlet-name>ControllerServlet</servlet-name><url-pattern>*.do</url-pattern> </servlet-mapping>
具体效果请参考07-03的例子,index.jsp中有四个链接,分别指向/a1.do, /a2.do, /xx/b1.do, /xx/yy/c1.do。web.xml中的ControllerServlet会接收以.do结尾的请求,并使用forward将请求转发到/test.jsp。点击/a1.do的情况。点击/xx/yy/c1.do的情况。这样做的一个好处是语义更清楚,只要看到以.do结尾的请求就知道肯定是交给ControllerServlet处理了,不管这个请求是在根路径还是子路径下,都会准确无误的找到对应的servlet。缺点就是不同路径之间进行forward,jsp里就不能再使用相对路径了,所以我们在test.jsp中使用request.getContextPath()获得当前应用在服务器中的位置(例子中是/07-03)将相对路径都组装成绝对路径,这种用法在以后也会经常用到。<%pageContext.setAttribute("ctx", request.getContextPath()); %> <p><a href="${ctx}/index.jsp">返回</a></p>
最后需要注意的是,这种请求映射就不能指定某一路径了,它必须是以星号(*)开始字母结尾,不能写成/*.do的形式。
<servlet-mapping><servlet-name>ControllerServlet</servlet-name><url-pattern>/user/*</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>ControllerServlet</servlet-name><url-pattern>/admin/*</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>ControllerServlet</servlet-name><url-pattern>*.do</url-pattern> </servlet-mapping>
7.3.2. 过滤链
- 执行EncodingFilter.doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding("gb2312");
- 执行SecurityFilter.doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。如果用户已登录,则访问请求的资源:/admin/index.jsp。如果用户未登录,则页面重定向到:/failure.jsp。
- 执行SecurityFilter.doFilter()中chain.doFilter()之后的部分:这里没有代码。
- 执行EncodingFilter.doFilter()中chain.doFilter()之后的部分:这里也没有代码。
7.4. filter的详细配置
<filter><filter-name>TestFilter</filtername><filter-class>anni.TestFilter</filter-class> </filter> <filter-mapping><filter-name>TestFilter</filtername><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher><dispatcher>EXCEPTION</dispatcher> </filter-mapping>
<filter-mapping><filter-name>TestFilter</filter-name><servlet-name>TestServlet</servlet-name> </filter-mapping> <servlet><servlet-name>TestServlet</servlet-name><servlet-class>anni.TestServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>TestServlet</servlet-name><url-pattern>/TestServlet</url-pattern> </servlet-mapping>
转载于:https://blog.51cto.com/77857/167230
第 7 章 使用filter过滤请求相关推荐
- java filter注入_如何使用Filter过滤请求中的SQL注入攻击
在doFilter方法中编写判断逻辑 public void doFilter(ServletRequest request, ServletResponse response, FilterChai ...
- TDI Filter 过滤驱动
By Fanxiushu 2013, 引用和转载请注明原作者 为了让大家有兴趣阅读下去, 举个正在使用的可能大家都比较熟悉的例子: 360 的安全卫士里,有个流量防火墙的功能, 它可以监视每个进程的 ...
- Filter过滤词汇
Filter过滤词汇(增强返回) 1.首先Filter使用注解设置拦截路径,将工程下的所有资源请求都拦下来 2.登录Servlet,在URL上传送数据,并在Servlet上的Post或是Get上对传送 ...
- 第九章 Django框架——csrf请求伪造和csrf_token使用
第九章 Django框架--csrf请求伪造和csrf_token使用 一.csrf请求伪造 二.csrf_token使用 三.简单的csrf_token应用 四.Ajax使用csrf_token 一 ...
- Elasticsearch query和filter过滤有什么不同
1. 概述 在使用DSL进行Elasticsearch的查询中,通常我们都是使用query进行过滤匹配,比如下面这段代码 GET /my_index/_search {"query" ...
- 验证多个Filter过滤一个资源时执行顺序
当有多个Filter过滤一个资源时,执行顺序到底是怎样? 如下测试: 定义两个Filter,FirstFilter,SecondFilter,它们过滤同一个index.jsp页面,并且SecondFi ...
- SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能
本教程的上一个步骤,我们学习了如何基于 OData V4 开发一个最简单的使用了 Table(表格)控件的 SAP UI5 应用. SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 ...
- django 模型类的常见字段约束,以及filter 过滤和查询
null 不设置时默认设置为False.设置为True时,数据库表字段中将存入NULL的记录. null和blank组合使用,null=True,blank=True,表示该字段可以为空 blank ...
最新文章
- 爷青回!GAN生成的超级马里奥关卡,可以永不通关的那种!
- 【机器学习】【发展史】概览
- 第十五届全国大学生智能车竞赛浙江赛区隆重开幕
- 深度案例 | 3 大领域 7 大场景,消费金融中的行业数据实践(以合众投资集团为例)...
- 基于R语言的梯度推进算法介绍
- IPC经典入侵,比3389实用(图)
- 三相滤波器怎么接线_单相电机和三相电机怎么接线?为什么三相电机有3或6个接线柱?...
- esper_Twitter4j和Esper:在Twitter上跟踪用户情绪
- Leetcode | Implement strStr()
- PAT甲题题解-1091. Acute Stroke (30)-BFS
- [ERR]com.microsoft.sqlserver.jdbc.SQLServerException: 结果集没有当前行
- 发电机机房设计规范_柴油发电机的容量怎么选择!发电机机房如何合理设计?来涨知识!...
- 有哪些毕设免费查重和降重的网站
- 飞机地铁的java项目怎么做_个人项目-地铁出行路线规划(Java代码实现)
- Echars地图加散点图配置
- IT十年人生过客-二十四-转型互联网
- 对于此版本,windows installer和即点即用的Office不能并行运行,因此只能安装一种类型(安装Visio破解版时的报错)
- 周星驰:初听不知曲中意,再听已是曲中人
- 那些主流的淘宝客引流方法有哪些?
- 虚幻4和Unity3D应该学哪个? 1
热门文章
- java里氏替换原则例子_java 设计原则(六)里氏替换原则
- docker 安装_Docker-安装
- 模型算法_生产建模型 算法控效率
- tp3.2设置php文件编码,thinkphp3.2版本url访问:总是走默认文件默认方法
- 单词字符的one-hot编码
- c语言16进制数给变量,C语言中怎样定义能够保存16进制整数的变量
- php-java-bridge 作用_PHP-Java-Bridge的使用(平安银行支付功能专版)
- 转https_PDF怎么转成JPG最简单?分享免费的PDF转图片方法
- 如何用python爬取公众号文章搜狗微信搜索_python如何爬取搜狗微信公众号文章永久链接的思路解析...
- Eclipse用法和技巧五:生成说明文档2