JavaEE核心技术之Filter过滤器
概念
*生活中的过滤器:净水器,空气净化器...
web中的过滤器:当访问服务器资源时,过滤器可以将请求拦下来,
完成一些特殊的功能
过滤器的作用:
一般用于完成通过的操作。如:登录验证,统一编码处理,敏感字符过滤...
快速入门:
1. 步骤:
1. 定义一个类,实现接口Filter
2. 复写方法
3. 配置拦截路径
2. 代码
@WebFilter("/*") //访问所有的资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo1被执行了。。。");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
3. 过滤器细节:
1. web.xml配置
和配置servlet基本一样的
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!--拦截路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
2. 执行流程
1. 执行过滤器
2. 执行放行后的资源
3. 回来执行放行代码下边的代码

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//对request对象请求消息增强
System.out.println("filterDemo2...");
//放行
chain.doFilter(req, resp);
//对response对象的响应消息增强
System.out.println("filterDemo2回来了。。。。");
}
3. 过滤器生命周期方法
1. init:在服务器启动后,会创建Filter对象,
然后调用init方法.只执行一次
2. doFilter:
每一次请求被拦截时,会被执行,执行多次。
3. destroy:
在服务器关闭后,filter对象被销毁,
如果是正常关闭,然后调用destroy方法,执行一次。
package com.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* @author OldAZ-PC
*/
@WebFilter(urlPatterns = "/FilterDemo3")
public class FilterDemo3 implements Filter {
/*
* 在服务器启动后,会创建Filter对象,然后调用init方法.只执行一次。
* */
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("init。。。");
}
/*
*每一次请求被拦截时,会被执行,执行多次。
*/
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter。。。");
chain.doFilter(req, resp);
}
/*
* 在服务器关闭后,filter对象被销毁,如果是正常关闭,然后调用destroy方法,执行一次。
*
* */
@Override
public void destroy() {
System.out.println("destroy...");
}
}
4. 过滤器配置详解
拦截路径配置
1. 具体路径资源:
/index.jsp 只有当访问index.jsp时,过滤器才会被执行。
2. 拦截目录:
/user/* 访问/user下的所有资源时,过滤器会被执行
3. 后缀名拦截
*.jsp 访问所有的jsp资源时,过滤器会被执行
4. 拦截所有的资源
/* 访问所有资源时,过滤器都会被执行。
拦截方式的配置
资源被访问的方式:
- 注解配置
-
设置dispatcher属性
- REQUEST:默认值,浏览器直接请求资源
/*浏览器直接请求index.jsp时,该过滤器会被执行*/
@WebFilter(urlPatterns = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
- FOEWORD:转发访问资源
/*只有浏览器转发访问index.jsp时,该过滤器会被执行*/
@WebFilter(urlPatterns = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
- INCLUSE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:一部访问资源
同时设置多个执行条件:
/*浏览器直接访问或者转发访问index.jsp时,该过滤器会被执行*/
@WebFilter(urlPatterns = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
-
web.xml
设置<dispatcherTypes></dispatcherTypes>
5. 过滤器链(配置多个过滤器)
配置多个过滤器,可以同时生效
执行顺序和先后
如果有两个过滤器,过滤器1和过滤器2
-
执行顺序:
1. 过滤器1 2. 过滤器2 3. 资源执行 4. 过滤器2 5. 过滤器1 -
过滤器先后顺序问题
-
注解配置
按照类名字符串的字符串进行逐个比较,值小的先被执行。 例:AFilter和BFliter两个过滤器,AFilter先执行。 -
web.xml
谁的<filter-mapping></filter-mapping>定义在上面,谁先执行

2165

被折叠的 条评论
为什么被折叠?



