概述:
过滤器是Servlet2.3以上新增加的一个功能,其技术也是非常强大的。通过Filter技术可以对WEB服务器的文件进行拦截,从而实现一些特殊的功能。在JSP开发应用中也是必备的技能之一。Filter可以改变一个request(请求)和修改一个response(响应)。Filter不是一个Servlet,它不能产生一个response,它能够在一个requsst到达Servlet之前预处理request,也可以在离开Servlet时处理response。
原理:
当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源关联,如果有的话容器把请求交给过滤器处理,在过滤器中,可以改变请求的内容,或者重新设置请求的信息,然后再将请求发送给目标资源,当目标资源对请求做出响应后,容器同样将响应先转发给过滤器,过滤器可以对响应的内容进行转换,然后再将响应发送到客户端

在一个Web应用中,是可以部署多个过滤器的,组成一个过滤器链。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到目标资源。WEB服务器根据Filter在web.xml文件中的注册顺序决定先调用哪一个Filter,当地一个Filter的doFilter方法被调用时,WEB服务器会创建一个Filter链的FilterChain对象传递给该方法。

说明:FIlter不是一个标准的Servlet,不能处理用户请求,也不能对客户端生成响应。主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理。
HttpServletRequest和HttpServletResponse工作流程
首先,在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest,然后根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据,当HttpServletResponse到达客户端之前,拦截HttpServletResponse,根据需要检查HttpServletResponse,也可以修改HttpServletResponse的头和数据。比如说当对用户发送的数据进行过滤,替换时就使用到这一点。
Filter使用基础
1.一个Filter必须实现javax.servlet,Filter接口并定义以下三个方法:
public void init(FilterConfig config)
public void doFilter(ServletRequest request,ServletResponse response,FilterChain)
public void destory()
2.FilterConfig接口
在配置filter时,可以使用
3.在web.xml文件中使用
Web.xml
SessionFilter com.action.login.SessionFilter logonStrings /project/index. jsp;login.do includeStrings .do;.jsp redirectPath /index.jsp disabletestfilter N SessionFilter /*
FilterServlet
package com.action.login;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class SessionFilter implements Filter {
public FilterConfig config;
public void destroy() {
this.config = null;
}
public static boolean isContains(String container, String[] regx) {
boolean result = false;
for (int i = 0; i < regx.length; i++) {
if (container.indexOf(regx[i]) != -1) {
return true;
}
}
return result;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest hrequest = (HttpServletRequest)request;
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
String logonStrings = config.getInitParameter("logonStrings");
String includeStrings = config.getInitParameter("includeStrings");
String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");
String disabletestfilter = config.getInitParameter("disabletestfilter");
if (disabletestfilter.toUpperCase().equals("Y")) {
chain.doFilter(request, response);
return;
}
String[] logonList = logonStrings.split(";");
String[] includeList = includeStrings.split(";");
if (!this.isContains(hrequest.getRequestURI(), includeList)) {
chain.doFilter(request, response);
return;
}
if (this.isContains(hrequest.getRequestURI(), logonList)) {
chain.doFilter(request, response);
retur