Servlet之Filter及FilterChain的使用详解

在 JavaEE 中没有 Interceptor(拦截器)的概念,不要和Struts2和Spring中的混淆。
但是有 Filter(过滤器),它实质就起拦截器的作用。

过滤器有两个要素:
1、实现一个接口:javax.servlet.Filter。
2、绑定访问路径,对其进行过滤。


[size=medium][b]一、什么是 Filter(过滤器)?[/b][/size]
Filter 是一个 Object, 用于改变 request/response 对象的请求头和请求体。
Filter 与其它的 web 组件不同的是,Filter 一般不会自己创建 response 对象对 web 请求进行响应,而是只提供方法,这些方法可绑定于任何 web 请求的资源。
可以对一个 web 资源配置一个或多个 Filter。

[size=medium][b]二、Filter 的主要任务:[/b][/size]
1. 过滤请求
2. 拦截请求或相应
3. 修改 request 对象的 header 和 body。(需要提供自定义的 request 对象)
4. 修改 response 对象的 header 和 body。(需要提供自定义的 response 对象)
5. 与外部资源交互

[size=medium][b]三、Filter 的用途:[/b][/size]
权限认证、日志、图片转换、数据压缩、加密、标记(Token)、XML转换等等。

[size=medium][b]四、使用 Filter[/b][/size]
filter API 定义在 javax.servlet 包下的 Filter, FilterChain, FilterConfig 类中。

使用 Filter 需要两步:
1、定义一个Filter 类(必须实现 Filter 接口)
2、配置 Filter(在 web.xml 中配置 或者是使用 @WebFilter 注解)

[b]1、定义一个Filter 类(必须实现 Filter 接口)[/b]
在 Filter 类中必须实现 Filter 接口的三个方法:
init(FilterConfig filterConfig):
Filter 实例化时被调用。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
Filter类的主要方法。
destroy()


package com.test.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
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.HttpSession;

public class SecurityFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
ServletContext context = this.filterConfig.getServletContext();
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
if (session.getAttribute("username") != null) {
context.log("Authentication passed.");
chain.doFilter(request, response);
} else {
context.log("Authentication failed.");
res.sendRedirect("../failure.jsp");
}
}
@Override
public void destroy() {
this.filterConfig = null;
}
}



[b] 2、配置 Filter(在 web.xml 中配置 或者是使用 @WebFilter 注解)[/b]

1)在 web.xml 配置:



SecurityFilter
com.test.filter.SecurityFilter


SecurityFilter
/*



2)使用 @WebFilter 注解(Since: Servlet 3.0)


package com.test.filter;

import javax.servlet.Filter;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

@WebFilter(
filterName = "SecurityFilter",
urlPatterns = {"/*"},
initParams = {
@WebInitParam(name = "mood", value = "awake")
}
)
public class SecurityFilter implements Filter {
//...
}



[size=medium][b]四、Filter 与 Interceptor 的区别[/b][/size]

[b]1、Filter介绍[/b]
Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filter再对服务器响应进行后处理。

[b]2、Struts - Interceptor介绍[/b]
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

[b]3、Filter和 Struts - Interceptor 的区别[/b]
- Filter是基于函数回调的(责任链设计模式),而Interceptor则是基于Java反射的(AOP设计模式)。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

[b]4、Filter和 Spring - HandlerInterceptor 的区别[/b]
[url=http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html]HandlerInterceptor[/url] is basically similar to a Servlet 2.3 Filter.
But in contrast to the latter it just allows custom pre-processing with the option of prohibiting the execution of the handler itself, and custom post-processing.


引用:

[url]http://docs.oracle.com/javaee/6/tutorial/doc/bnagb.html[/url]
[url]http://blog.csdn.net/zhaozheng7758/article/details/6105749[/url]
[url]http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebFilter.html[/url]
[url]http://www.cnblogs.com/luoyun/archive/2013/01/04/2844274.html[/url]


-
转载请注明
原文出处:http://lixh1986.iteye.com/blog/1765692


-

你可能感兴趣的:(JSP)