1 什么是过滤器
2 过滤链
3 开发过滤器的三要素
开发第一个过滤器:
Dofilter参数:
chain.dofilter,把请求依次向后传递
配置web.xml文件
4 过滤器的生命周期
Init方法在应用启动时自动执行,但是init执行之后不会立即执行dofilter方法,因为dofilter方法执行的时期,是在每一个请求过来之后被dofilter方法进行拦截处理.
在有请求过来后:
应用关闭后,过滤器会被销毁
5 过滤器的特性
6 过滤器的两种开发方式
1)配置形式
2)注解形式
如果有多个过滤器分别通过配置形式或注解形式定义,在请求过来时,会先通过配置形式的过滤器,再通过注解形式的过滤器.
3)配置与注解如何选择
- 配置形式维护性更好,适合应用全局过滤
- 注解形式开发体验更好,适用于小型项目敏捷开发
4)Web中文乱码的解决
ServletRequest接口
为什么参数中使用ServletRequest对象,还要在代码中将其强制转换成HttpServletRequest?
这里就涉及到j2ee底层的机制了
ServletRequest接口是最顶级的接口,这里定义了所有请求的共通特点.
7 过滤器的开发技巧
1)过滤器参数化
过滤器为了增强灵活性,允许配置信息放在web.xml
在web.xml中配置<init-param>设置过滤器参数
如果有多个参数,就罗列多个<init-param>标签即可.
在web.xml中配置
使用注解配置
2)url-pattern设置过滤范围
实际运用案例:
精准匹配:
前缀匹配:
注意:
/ 映射的问题:
- / 指映射Web应用根路径,且只对Servlet生效
- 默认首页index.jsp会让 / 失效
- / 与 /* 含义不同,前者指向根路径,后者代表所有的URL
实际应用案例:
访问SampleServlet2
如果有默认首页index.jsp,访问地址也是http://localhost:8080/url-pattern/
那最后默认首页和过滤器过滤的Servlet URL哪个会生效呢?
试着访问一下这个路径
可以看到是默认首页生效了,同时控制台也没有打印任何内容。
这里涉及到Tomcat一个底层机制,默认首页比Servlet优先级高。尽管在url中访问的是根路径,但是因为.xml配置了默认首页,实际上是隐式跳转到了index.jsp。因此,如果我们要拦截默认首页的话,要使用后缀匹配的方式*.jsp 或者 精准匹配 /index.jsp 才会生效。在实际开发中尽量不要使用index.jsp这个默认首页。
另,如果想对根路径,jsp文件以及所有Servlet前缀的url都进行过滤,这种复合条件该如何编写?
①在web.xml的filter中增加多个对应的filter-mapping,包装名称一致,url依次编写即可。在程序执行的时候会按照这些url的编写顺序依次过滤。
②注解方式
8 过滤链开发注意事项
1)每一个过滤器应具有独职能
2)过滤器的执行顺序以<filter-mapping>为准
3)调用chain.doFilter()将请求向后传递。如果没有写这一句,只会匹配第一个,不会再往后匹配(请求不会向后传递)。
使用web.xml配置url时,按照在配置文件中编写的位置决定;
使用注解方式配置url时,是按照过滤器类名的排序规则来决定的,默认按照字母表升序排列且不区分大小写。实际开发中不建议用这种方式。
9 项目中过滤器的应用场景
1)多端设备自动匹配
原理:根据过滤器拦截到的url得到所使用的设备,在前面加上相应的前缀。
访问localhost:8080/index.html
若识别出来是手机 加上moblie前缀localhost:8080/mobile/index.html
若识别出来是PC 加上desktop前缀localhost:8080/desktop/index.html
实践案例:
实际开发一个项目若有多个应用,一般安装多个tomcat配置不同的端口,这样一个应用崩溃不会影响到其他的应用。同时上下文路径Context root 为 /。
PC端访问时
移动端访问时