过滤器-filter详解

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)

过滤器链执行顺序:

  1. 基于配置文件(xml)的过滤器链:过滤器链的执行顺序由配置文件中的mapping标签的先后决定
  2. 基于注解的过滤器链: 过滤器链的执行顺序由过滤器的类名称决定

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>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值