**
Filter
**
Filter翻译为过滤器,当客户端向服务器端发送一个请求时,如果有对应的过滤器进行拦截,过滤器可以改变请求的内容、或者重新设置请求协议的相关信息等,然后再将请求发送给服务器端的Servlet进行处理。当Servlet对客户端做出响应时,过滤器同样可以进行拦截,将响应内容进行修改或者重新设置后,再响应给客户端浏览器。在上述过程中,客户端与服务器端并不需要知道过滤器的存在。
下图说明了过滤器的原理:
在上图,多个过滤器形成了一个过滤器链,每个过滤器执行自己的操作,直到到达Servlet。
下面来看代码:
@WebFilter(value = "/*")//里面的路径代表访问所有的资源都要经过这个过滤器
public class Filter_practice1 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//对request对象的请求消息增强
System.out.println("过滤器被执行了...");
//放行
filterChain.doFilter(servletRequest,servletResponse);
//对response对象的响应消息增强
System.out.println("过滤器又被执行了...");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init...");
}
@Override
public void destroy() {
System.out.println("destroy...");
}
在客户端和服务器端(index.jsp)加上了一个Filter,现在我们来访问index.jsp来看一下控制台的输出。
过滤器被执行了...
index.jsp
过滤器又被执行了...
根据这个结果我们可以知道,在客户端访问index.jsp的时候,Filter进行了一些操作(这里是输出一句话),然后把请求消息放行。然后index.jsp对客户端发送响应消息的时候,又经过Filter,做了一些操作(输出一句话),然后放行了响应消息,发送给客户端。
关于Filter还有的地方就是@WebFilter注解,上面Filter传递的路径参数代表访问这个服务器的所有资源都要经过此Filter,我们可以根据需求更改这个路径。
此外,dispatcherTypes也是常用的一个参数。设置dispatcherTypes属性时有五个值:
1.REQUEST:默认值,浏览器直接请求资源时才会执行
2.FORWARD:转发访问资源时才会执行
3.INCLUDE:包含访问资源时才会执行
4.ERROR:错误跳转资源时才会执行
5.ASYNC:异步访问资源时才会执行
例如
//转发资源时执行的Filter
@WebFilter(value="/*",dispatcherTypes = {DispatcherType.FORWARD})
//浏览器直接请求资源与转发资源时执行的Filter
@WebFilter(value="/*",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})