过滤器是一个服务器端的组件,它可以截取用户端的请求与相应信息,并对这些信息过滤。
工作原理
生命周期
- init() 过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。
- doFilter() 完成实际的过滤操作。过滤器的核心方法。当用户请求访问与过滤器关联的URL时,Web容器将先调用过滤器的doFilter方法。FilterChain参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发、重定向将请求转发到其他资源。
- destroy() web容器在销毁过滤器实例前调用该方法。在这个方法中可以释放过滤器占用的资源。(大多数情况用不到)
配置
注解 @WebFilter
过滤器注解(实用注解则不需要配置xml)
//过滤所有页面
@WebFilter(filterName = "Filter",urlPatterns = "/*")
//过滤所有页面的error
@WebFilter(filterName = "ErrorFilter",urlPatterns = "/error.jsp",dispatcherTypes = DispatcherType.ERROR)
【实例】
@WebFilter(filterName = "AsynFilter",value = {"/error.jsp"},dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.ASYNC})
xml配置
【实例】
@WebFilter(filterName = "Filter",urlPatterns = "/*")
public class Filter implements javax.servlet.Filter {
public void destroy() {
System.out.println("destroy.......................................");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("start-----------------------------------doFilter");
chain.doFilter(req, resp);
System.out.println("end-------------------------------------doFilter");
}
public void init(FilterConfig config) throws ServletException {
System.out.println("init--------------------------------------------filter");
}
}
过滤器链
服务器会按照web.xml中过滤器定义的先后顺序组装成一条链
注解filter执行顺序:根据filter类名的字母顺序确定
xml配置filter执行顺序:通过每个filter-mapping在web.xml中出现的先后顺序来确定
过滤器分类
错误页面引导
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
过滤器应用场景
- 对用户请求进行统一认证
- 编码转换
- 对用户发送的数据进行过滤替换
- 转换图像格式
- 对响应的内容进行压缩
- 对数据进行加密解密
【过滤器登录校验案例】登录案例,慕课网视频
【过滤器编码转换案例】编码转换案例,慕课网视频