Struts 2 拦截器


1、Struts2实现原理:

当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器,如图所示。

图1 拦截器调用序列图


2、Struts2默认的所有拦截器:

  1.  <interceptor-stack name="defaultStack">  
  2.     <interceptor-ref name="exception"/><!-- 用于捕获异常 -->  
  3.     <interceptor-ref name="alias"/>  
  4.     <interceptor-ref name="servletConfig"/><!-- 将源于Servlet API的各种对象注入到Action -->  
  5.     <interceptor-ref name="i18n"/>  
  6.     <interceptor-ref name="prepare"/>  
  7.     <interceptor-ref name="chain"/>  
  8.     <interceptor-ref name="scopedModelDriven"/>  
  9.     <interceptor-ref name="modelDriven"/>  
  10.     <interceptor-ref name="fileUpload"/><!-- 将文件和元数据从多重请求转换为常规请求 -->  
  11.     <interceptor-ref name="checkbox"/>  
  12.     <interceptor-ref name="multiselect"/>  
  13.     <interceptor-ref name="staticParams"/><!-- 将在配置文件中配置的参数注入到Action中对应的属性 -->  
  14.     <interceptor-ref name="actionMappingParams"/>  
  15.     <interceptor-ref name="params"><!-- 将请求的数据设置到Action中的属性上 -->  
  16.         <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,  
  17.                      ^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>  
  18.     </interceptor-ref>  
  19.     <interceptor-ref name="conversionError"/>  
  20.     <interceptor-ref name="validation"><!-- 执行数据验证 -->  
  21.         <param name="excludeMethods">input,back,cancel,browse</param>  
  22.     </interceptor-ref>  
  23.     <interceptor-ref name="workflow"><!-- 当数据验证错误时,提供终止流程的功能 -->  
  24.         <param name="excludeMethods">input,back,cancel,browse</param>  
  25.     </interceptor-ref>  
  26.     <interceptor-ref name="debugging"/>  
  27. </interceptor-stack>  

在struts-default.xml中已经配置了以上的拦截器。如果您想要使用上述拦截器,只需要在应用程序struts.xml文件中通过“<include file="struts-default.xml" />”将struts-default.xml文件包含进来,并继承其中的struts-default包(package),最后在定义Action时,使用“<interceptor-ref name="xx" />”引用拦截器或拦截器栈(interceptor stack)。一旦您继承了struts-default包(package),所有Action都会调用拦截器栈 ——defaultStack。当然,在Action配置中加入“<interceptor-ref name="xx" />”可以覆盖defaultStack。

3、Struts2为我们提供了一个Interceptor接口,该接口源代码如下:

  1. publicinterface Interceptor extends Serializable {  
  2.     void destroy();  
  3.     void init();  
  4.     String intercept(ActionInvocation invocation) throws Exception;  
  5. }  

1)    init():在拦截器执行之前调用,主要用于初始化系统资源。

2)    destroty():init()对应,用于拦截器执行之后销毁资源。

3)    intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action,则返回该actionexecute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。

Struts2还为我们提供了一个AbstractInterceptor类,该类的init()destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。

4、下面以一个登录的例子为例自定义拦截器:

首先自定义一个拦截器类,该类可以实现Interceptor接口或继承AbstractInterceptor类:

  1. public class PermissionInterceptor implements Interceptor {  
  2.   
  3.     @Override  
  4.     public void destroy() {  
  5.         // TODO Auto-generated method stub   
  6.     }  
  7.     @Override  
  8.     public void init() {  
  9.         // TODO Auto-generated method stub   
  10.     }  
  11.     @Override  
  12.     public String intercept(ActionInvocation invocation) throws Exception {  
  13.         // TODO Auto-generated method stub   
  14.         ActionContext cont=ActionContext.getContext();  
  15.         Object obj=cont.getSession().get("user");  
  16.         if(obj!=null){  
  17.             return invocation.invoke();  
  18.         }  
  19.         cont.getSession().put("message""非法跳转,请先登录!");  
  20.         return "login";  
  21.     }  
  22. }  
在struts.xml配置拦截器:
  1. <struts>  
  2.     <package name="base" extends="struts-default">  
  3.         <global-results><!-- 定义全局视图 -->  
  4.                 <result name="login" type="redirect" >/login.jsp</result>  
  5.         </global-results>  
  6.     </package>  
  7.   
  8.     <package name="default" namespace="/test" extends="base">  
  9.         <interceptors>  
  10.             <interceptor name="permission" class="org.han.interceptor.PermissionInterceptor" />  
  11.             <interceptor-stack name="permissionStack"><!-- 拦截器栈 -->  
  12.                 <interceptor-ref name="defaultStack" />  
  13.                 <interceptor-ref name="permission" /><!-- 如果需要加载默认拦截器,自定义拦截器要放默认拦截器后面 -->  
  14.             </interceptor-stack>  
  15.         </interceptors>  
  16.     </package>  
  17. </struts>  
  • 1
  • 2
  • 下一页

相关内容