过滤器

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端访问时

移动端访问时

 

 

 

 

 

posted @ 2020-04-10 14:24  阿江是个程序猿  阅读(150)  评论(0编辑  收藏  举报