Filter主要用于对用户请求进行预处理,也可以对HttpServletResponse进行处理,是一个典型的处理链。Filter也可以对用户请求生成相应,但实际上很少用Filter向用户生成相应。使用Filter的流程一般为:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成相应,最后Filter在对服务器相应进行处理。Filter可以拦截用户的HttpServletRequest,并且可以修改HttpServletRequest头和数据。同时,Filter也可以拦截服务器的HttpServletResponse,并且可以修改HttpServletResponse头和数据。
创建一个Filter只需两个步骤:1.创建Filter处理类。2.web.xml文件中配置类。
创建Filter类必须实现javax.servlet.Filter接口,在该接口中定义了如下方法。
void init(FilterConfig config):用于完成Filter的初始化。
void destrory():用于Filter销毁前,完成某些资源回收。
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实现过滤功能,该方法对每个请求或相应增加额外的处理。
下面是一个简单的Filter,这个Filter主要是查看用户请求的页面地址,如果不是登陆页面就跳转到登陆页面。
public class ReqFilter implements Filter {
private FilterConfig config;
public void init(FilterConfig config) {
this.config = config;
}
public void destroy() {
this.config = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//获取filter的配置信息,这里获取登陆页面的路径。
String loginPage = config.getInitParameter("login");
HttpServletRequest req = (HttpServletRequest) request;
//获取用户请求的页面。
String requestPath = req.getServletPath();
//判断用户请求的页面是不是登陆页面,如果是就放行请求,不是就跳转到登陆界面。
if (!requestPath.endsWith(loginPage)) {
System.out.println("你请求的页面是:"+requestPath+",将会跳转到登陆页面。");
request.getRequestDispatcher(loginPage).forward(request, response);
} else {
chain.doFilter(request, response);
System.out.println("你请求的页面是登陆页面");
System.out.println("处理前:"+response.getContentType());
response.setContentType("text/txt");
System.out.println("处理后:"+response.getContentType()););
}
}
}
doFilter既能对用户请求进行处理,也能对服务器响应进行处理。它们的分界线为是否调用了chain.doFilter(),执行该方法前对用户请求进行处理,执行该方法后对服务器响应进行处理。
Filter类的配置与Servlet类似,只需配置Filter的名字与实现类,名字和Filter拦截的URL,/*表示拦截所有的请求,具体代码如下:
<filter>
<filter-name>filter</filter-name>
<filter-class>ReqFilter</filter-class>
<init-param>
<param-name>login</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
该贴被xiuwen.zhao编辑于2014-8-29 17:20:18