javaweb有三大组件:filter servlet 和listener,这里简单介绍下过滤器filter的作用场景和实现方式以及基本特征,
作用
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,过滤请求和响应,主要用来过滤请求
应用场景
过滤非法字符,统一编码,权限控制…
实现方式
filter有实现方式:配置文件和注解两种方式
配置文件方式:
1.编写一个类
实现Filter接口,重写filter接口中的init,doFilter和destroy三个抽象方法
2.编写配置文件(先找到绑定路径Filter-mapping的url-pattern(前端路径),然后通过filter-name(代码名称)找到filter-class,这个过程叫映射:即将前端路径映射到后端代码上)
<!-- 注册我们的过滤器filter -->
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.cangaroo.cn.MyFilter</filter-class>
</filter>
<!-- 绑定需要过滤的路径: 编写映射 mapping -->
<filter-mapping>
<filter-name>demo1</filter-name>
<url-pattern>/demo1</url-pattern>
</filter-mapping>
注解方式:
1.编写一个类,实现filter接口,重写抽象方法
2.在该类上添加 @WebFilter 注解
@WebFilter(filterName = “FilterDemo2”,urlPatterns = “/demo1”)
filterName : 过滤器注册给tomcat的名称
urlPatterns : 当前过滤器过滤的路径
doFilter方法
执行过滤的方法
1. ServletRequest request:存放请求信息的对象
2. ServletResponse response:存放响应信息的对象
3. FilterChain过滤链:chain.doFilter(req, resp);
--> 多个filter对一个请求进行的过滤的时候,形成一个过滤器链,过滤器链顺行
--> 当第一个过滤器放行的时候,将请求放行到下一个过滤器上.
--> 若当前的过滤器是最后一个过滤器,放行的时候才可以到达目标资源(Servlet)
过滤器链执行顺序:
- 基于配置文件(xml)的过滤器链:过滤器链的执行顺序由配置文件中的mapping标签的先后决定
- 基于注解的过滤器链: 过滤器链的执行顺序由过滤器的类名称决定
Filter其他内容
一个路径只能访问一个servlet,但一个servlet可以被多个路径所访问到.
一个过滤器可以过滤多个路径,一个路径可以被多个过滤器所过滤
过滤路径的多种编写方式(urlPartterns)
1. 完全匹配 : /aa/demo1 只过滤这个路径发送过来的请求,(aa是前后端的指定路径)和包名无关
2. 目录匹配 : /bb/* 过滤路径为bb/的所有路径发送的请求
3. 后缀名匹配 : *.jsp .action 过滤所有后缀名为(jsp action等)的文件发送的请求
4. 缺省匹配 : / 找不到路径时,程序就不会继续往下走,会找Tomcat服务器,Tomcat服务器就会去自己的xml文件中找出现这种情况的处理方式,然后返回404错误,提示访问路径找不到
@WebFilter(filterName = “MyFilter”, urlPatterns = "/cc/")
Filter生命周期
#### Filter生命周期相关方法
1. init() 初始化方法:项目启动时执行
2. doFIlter(request,response,chain) 过滤逻辑,当前过滤器可以过滤访问的路径时,doFilter方法就会执行
3. destory() 销毁方法:服务器正常关闭或项目从服务器上移除
servlet生命周期:
创建: 第一次请求来的时候,创建servlet对象,并执行init方法
init: 第一次请求来的时候
service: 每次请求来的时候,请求一次执行一次
destroy: 服务器正常关闭,或项目从服务器上移除.
执行原理
Filter是单实例多线程的
1. 创建:当服务器启动的时候,服务器会创建Filter对象,执行init方法,实现初始化操作.
2. 执行过滤:当请求来的时候,判断该请求是否需要过滤(根据路径判断),若需要,则调用filter的doFilter方法,执行过滤操 作.若不需要过滤,直接访问资源
3. 销毁:当服务器正常关闭的时候或项目从服务器上移除的时候,服务器会调用destory方法,实现filter的销毁操作.
拦截方式dispatcher:过滤器的选择过滤
dispatcher:拦截从哪个地方发送的请求,然后进行过滤请求
dispatcherTypes: 设置拦截方式(两个取值)
1. DispatcherType.REQUEST : 拦截浏览器发送的请求 (默认)
2. DispatcherType.FORWARD : 拦截请求转发的请求
注意:
一旦给dispatcherTypes设置了值,那么默认值将会被覆盖,但dispatcher标签可以出现多次,即:既可以设置为request,同时也可以设置为forward,两种情况下都会执行过滤器filter。
xml:
<filter>
<filter-name>CCFilter</filter-name>
<filter-class>com.itheima.e_disp.CCFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>DispFilter</filter-name>
<url-pattern>/cc/*</url-pattern>
<dispatcher>REQUEST</dispatcher> // 过滤浏览器发送的请求
<dispatcher>FORWARD</dispatcher> // 过滤请求转发的请求
</filter-mapping>
注解:
dispatcherTypes = DispatcherType.FORWARD
dispatcherTypes = DispatcherType.REQUEST
dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST}
urlPatterns = "/*"
错误的友好页面
只需要在项目下提供错误的友好页面
在web.xml中配置error-page: 可以为错误响应,设置指定的页面(即404.jsp文件,在web,目录下创建404.jsp文件即可)
eg:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>