什么是拦截器(Interceptor )?
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在WEB中,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。这是Webwork中给出的解释。
拦截器链(InterceptorChain,struts中叫做拦截器栈 InterceptorStack),就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会
按其之前定义的顺序被调用。
什么是过滤器(filter)?
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这
之后,过滤器可以作如下的选择:
1.以常规的方式调用资源(即,调用servlet或JSP页面)。
2.利用修改过的请求信息调用资源。
3.调用资源,但在发送响应到客户机前对其进行修改。
4.阻止该资源调用,将其转到其他的资源,返回一个特定的状态代码或生成替换输出。
两者的区别:
1.拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2.拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用,包括一些静态资源的访问。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
不说了直接上代码:
拦截器:
[java] view plain copy
- public class UserInterceptor extends AbstractInterceptor {
-
- private static final long serialVersionUID = 1L;
- private Logger log=LoggerFactory.getLogger(UserInterceptor.class);
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
- String result;
- String methodName = invocation.getInvocationContext().getName();
- log.info(methodName);
- Object action = invocation.getAction();
- if(action instanceof UserAction)
- {
-
- UserAction useraction = (UserAction)action;
-
- }
- log.info("调用之前doSomething..........");
- result=invocation.invoke();
- log.info("调用之后doSomething..........");
- return result;
- }
-
- }
struts2配置:
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
- <struts>
- <package name="default" extends="struts-default" >
- <interceptors>
- <interceptor name="userInterceptor" class="lishuai.interceptor.UserInterceptor"></interceptor>
- <interceptor-stack name="interceplist">
- <interceptor-ref name="defaultStack"></interceptor-ref>
- <interceptor-ref name="userInterceptor"></interceptor-ref>
- </interceptor-stack>
- </interceptors>
-
- <action name="user_*" class="lishuai.action.UserAction" method="{1}">
- <interceptor-ref name="interceplist"></interceptor-ref>
- </action>
- </package>
-
- </struts>
注:action配的是个拦截器栈,注意defaultStack是struts2的默认拦截器如果不配置则会覆盖掉struts2的默认拦截器,后果就是模型驱动(ModelDriven<T>)或者属性注入等,会
注入失败。
过滤器:
[java] view plain copy
- public class CharacterEncodingFilter implements Filter {
-
-
-
- private String characterEncoding;
-
-
-
- private boolean enabled;
-
- @Override
- public void destroy() {
-
-
- }
-
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
-
- if (enabled || characterEncoding != null) {
- request.setCharacterEncoding(characterEncoding);
- response.setCharacterEncoding(characterEncoding);
- }
- chain.doFilter(request, response);
- }
-
- @Override
- public void init(FilterConfig config) throws ServletException {
- characterEncoding = config.getInitParameter("characterEncoding");
- enabled = "true".equalsIgnoreCase(config.getInitParameter("enabled").trim());
- }
-
- }
web.xml配置:
[html] view plain copy
- <filter>
- <filter-name>CharacterEncodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CharacterEncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
注: 自己定义的过滤器要放到strtus2的过滤器之前的, 如果放在struts2过滤器之后,你自己的过滤器对action的过滤作用就废了,不会有效!除非你是访问jsp/html,切记。
来源于:http://blog.csdn.net/u014655465/article/details/46826439