Filter
定义
过滤器, 其实就是对客户端发出来的请求进行过滤。浏览器发出请求后,然后服务器派servlet处理,Filter在中间就可以过滤,其实过滤器起到的是拦截的作用。
作用
- 对一些敏感词汇进行过滤
- 统一设置编码
- 自动登录
... ...
用法
- 定义一个类, 实现Filter接口
public class FilterDemo implements Filter { public void destroy() {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("请求已经来到过滤器中..."); chain.doFilter(request, response);//过滤器放行 } public void init(FilterConfig fConfig) throws ServletException {} }
- 注册过滤器 在web.xml里面注册,注册的手法与注册servlet基本一样。
<filter> <display-name>FilterDemo</display-name> <filter-name>FilterDemo</filter-name> <filter-class>filter.FilterDemo</filter-class> </filter> <filter-mapping> <filter-name>FilterDemo</filter-name> <url-pattern>/FilterDemo</url-pattern> </filter-mapping>
Filter的生命周期
- 创建
在服务器启动的时候就创建。
- 销毁
服务器停止的时候。
Filter执行顺序
-
客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet
-
如果有多个过滤器, 那么他们会按照注册的映射顺序(<filter-mapping>)来排队。 只要有一个过滤器, 不放行,那么后面排队的过滤器以及servlet都不会收到请求。
-
从服务器中返回到客服端也会经过Filter, 不过一般是在请求到达时,进行拦截处理,返回一般是直接让它通过的。可以在chain.doFilter(request, response);语句后面加一条输出语句看看效果。返回时经过过滤器的顺序与请求进来时经过的过滤器顺序是相反的。
Filter的细节
-
init方法的参数 FilterConfig , 可以用于获取filter在注册的名字以及初始化参数。 其实这里的设计的初衷与ServletConfig是一样的,不过较少使用。
-
如果想放行,那么在doFilter 方法里面操作,使用参数 chain
chain.doFilter(request, response);//放行,让请求到达下一个目标。
-
<url-pattern>/*</url-pattern> 写法格式与servlet一样。
-
全路径匹配 以 / 开始
/LoginServlet
-
以目录匹配 以 / 开始 以 * 结束, 访问该目录下的资源都会经过过滤器
/demo01/*
-
以后缀名匹配 以 * 开始 以后缀名结束,访问以该后缀名结尾的资源都会经过过滤器
如*.jsp *.html 等等
-
- 针对 dispatcher 设置
REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
FORWARD : 只要是转发都拦截。
ERROR : 页面出错发生跳转
INCLUDE : 包含页面的时候就拦截。