过滤器
过滤器介绍
- filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行
- 并且可以对目标资源访问前后进行逻辑处理
🐤过滤器编写步骤
- 编写一个过滤器的类实现
Filter接口 - 实现接口中尚未实现的方法(重点实现doFilter方法)
- 在
web.xml中进行配置(主要是配置要对哪些资源进行过滤)- 配置
filter-class,配置过滤器 - 配置
filter-mapping,对哪些资源进行过滤
- 配置
- 代码实现
实现filter接口
public class FirstFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter run");
}
public void destroy() {
}
}
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>filtername</filter-name>
<filter-class>com.bntang666.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filtername</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
下次启动服务器,客户都访问一个资源的时候,会被过滤器拦截,要在过滤器当中进行放行之后, 才能够访问到对应的Servlet,放行可以通过调用chain.doFilter(req,res)方法,把request、和response传递过去
过滤器的访问流程
- 在发送一个请求时,
web容器会先到filter当中,创建三个参数,res、req、chain - 在过滤器当中,放行之后,才能够访问到对应的资源
- 中间的过滤器可能有多个,在一个过滤器当中,可以调用另外一个过滤器
- 也有可能过滤器没有拦截所有的资源,有些资源可以直接被访问
Filter生命周期
init
- 当filter对象创建时调用
- 当服务器启动时创建
- 因为有可能一个filter对应多个Servlet
- 启动时, 先把filter准备好, 访问资源时就可以进行过滤了
- filterconfig
- 当前filter对象的配置信息
- 和servletConfig差不多, 获取名称,参数
- 获取servletContext对象
- 先有的ServletContext
dofitter
- 当匹配到mapping时调用dofilter
- 参数
- request
- response
- FilterChain
- 过滤器链对象
- 内部维护着各个filter的索引,并且知道所有filter的顺序
- 是根据mapping的顺序来执行的
destroy
- 当filter对象销毁时调用
- 关闭服务器时销毁对象
- 和servletContext的生命周期是一样
配置
mapping
- 完全匹配
- 目录匹配
- 扩展名匹配
servlet_name
- 可以把路径直接指定某一个servlet
- 可以有多个servlet_name
- 开发中基本上使用的都是mapping
dispatcher
- 配置请求的形式,不是请求方式,是页面跳转的形式
- 形式分类
- REQUEST:默认值,代表直接访问某个资源时执行filter
- ERROR:发生错误时进行跳转时的执行filter
- INCLUDE:包含资源时执行filter
- FORWARD:转发时才执行filter,转发之后, 才去执行filter

浙公网安备 33010602011771号