过滤器
一、过滤器概述
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
①以常规的方式调用资源(即,调用servlet或JSP页面)。
②利用修改过的请求信息调用资源。
③调用资源,但在发送响应到客户机前对其进行修改。
④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
图形化解释
过滤器
过滤器的配置方法
基于注解方式配置
package cn.Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*") //访问所有资源前都会拦截
public class filter 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("filter被执行****");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
解释:
@WebFilter("/*") //访问所有资源前都会拦截
/* 是指可以拦截所有的访问资源,其中@WebFilter(" ")里面可以是任意的路径。
filterChain.doFilter(servletRequest, servletResponse);
一般Filter都是一个链,web.xml 里面配置了几个就有几个(注解配置也可以)。一个一个的连在一起
基于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>demo1</filter-name>
<filter-class>cn.Filter.filter</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
*和xml配置路由差不多,< url-pattern> < /url-pattern> 其中配置里面填写的内容为路径,/默认拦截全部路径。
过滤器执行流程
package cn.Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDemo1 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filter come");
// 放行
chain.doFilter(req, resp);
System.out.println("filter back");
}
public void destroy() {
}
}
当访问 http://localhost/index.jsp 资源时,首先执行的是
System.out.println(“filter come”); 然后通过过滤器(chain.doFilter(req, resp);)
然后返回过滤器执行 System.out.println(“filter back”);
过滤器生命周期
package cn.Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDemo2 implements Filter {
public void init(FilterConfig config) throws ServletException {
System.out.println("init..");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("doing..");
chain.doFilter(req, resp);
}
public void destroy() {
System.out.println("destroy..");
}
}
解释:
服务器启动就会创建Filter对象调用init方法
解释:
服务器关闭销毁Filter对象,服务器正常关闭就会调用destroy方法
public void doFilter() //每次拦截时都会调用此方法
public void destroy() //只被调用一次
public void init() //只被调用一次
过滤器配置
拦截路径配置
1.具体资源路径: /index.jsp 只有访问index. jsp资源时,过滤器才会被执行
2.拦截目录: /user/访问/user 的所有资源时,过滤器都会被执行
3.后缀名拦截: “ * .jsp ”访问所有后缀名为jsp资源时,过滤器都会被执行
4.拦截所有资源:/ 访问所有资源时,过滤器都会被执行
拦截方式配置
注解配置
设置dispatcherTypes属性
- REQUSET : 默认值,浏览器直接请求资源
- FORWORD :转发访问资源
- INCLUDE :包含访问资源
- ERROR :错误跳转资源
- ASYNC :异部访问
具体应用:
@WebFilter(value = "/*" , dispatcherTypes = DispatcherType.FORWARD)
web.xml配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.Filter.filter</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
< dispatcher> < /dispatcher>中间的属性值也是上面注解属性中的五个属性。
过滤器链(配置多个过滤器)
执行顺序
以两个过滤器为例:过滤器1、过滤器2。
- 过滤器1
- 过滤器2
- 资源
- 过滤器2
- 过滤器1
过滤器先后顺序
1、 注解配置
按照类名的字符串比较顺序,值小先执行
如Afilter和Bfilter先执行Afilter
2、 xml配置
< filter-mapping >谁在上面谁先执行