Struts中拦截器的使用

了解Struts 2 中的默认拦截器

(具体的使用方法还得研究API文档)

<interceptors>
    <!--别名拦截器:通过定义别名,让不同的action通过不同的名字共享相同的request请求参数 -->
    <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
    <!--自动装配拦截器:主要用于当Struts与Spring整合时,Struts可以使用自动装配的方式来访问Spring容器中得bean  -->
    <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
    <!--链拦截器:构建一个Action链,使得当前Action可以访问前一个Action的属性,一般和<result type="chain"/> 一起使用  -->
    <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
    <!--转换器错误拦截器:负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FiledError错误  -->
    <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
    <!--  -->
    <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
    <!--清除Session拦截器:负责销毁HttpSession 对象  -->
    <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
    <!--创建Session拦截器:负责创建一个HttpSession对象,主要用于那些需要HttpSession对象才能正常工作的拦截器中  -->
    <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
    <!--调试拦截器:当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息  -->
    <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
    <!--扩展拦截器:负责扩展引用  -->
    <interceptor name="externalRef" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>
    <!--执行和等待拦截器:后台执行Action时,给用户显示一个过渡性的等待页面  -->
    <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
    <!--异常拦截器:将Action抛出的异常映射到结果,这样就可以通过重定向自动处理异常  -->
    <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
    <!--文件长传拦截器:这个拦截器主要用户文件上传,它负责解析表单中文件域的内容  -->
    <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
    <!--国际化拦截器:负责吧用户所选的语言,区域放入用户的session中  -->
    <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
    <!--日志拦截器:主要负责输出Action的名字,提供简单的日志输出  -->
    <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
    <!--模型驱动拦截器:当某个Action类实现了ModelDriven接口时,负责把getModel()方法的结果推入ValueStack中  -->
    <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
    <!--作用域驱动拦截器:如果一个Action实现了一个scopedModelDriven接口,-->
    <!-- 该拦截器负责从指定生存范围中找出指定的Model,并通过setModel方法将该Model传给Action实例  -->
    <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
    <!--参数过滤器:它负责解析Http请求中得参数,并将参数值设置成Action对应的属性值  -->
    <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
    <!--该拦截器设置从action映射,当前请求,所有的参数到值栈中。他的操作就像parametersInterceptor一样,-->
    <!--只是参数从ActionMapping中来,而不是从actionContext.getParameters()  -->
    <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
    <!--预备拦截器:如果Action实现了Preparable接口,当回调用该拦截器的prepare方法  -->
    <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
    <!--静态参数拦截器:负责将xml中<action> 标签下的<param>标签中得参数传入Action中  -->
    <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
    <!--作用域拦截器:这是范围转换拦截器,他可以将Action状态信息保存到HttpSession范围内,或者保存到ServletContext范围内  -->
    <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
    <!--Servlet配置拦截器:如果某个Action需要直接访问ServletAPI,就通过这个拦截器实现,它提供HttpServletRequest和HttpServletResponse的方法,以map方式访问  -->
    <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
    <!--  -->
    <interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
    <!--计时拦截器:负责输出Action的执行时间,再分析Action的性能瓶颈是比较有用  -->
    <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
    <!--令牌拦截器:主要用于阻止表单重复提交,它检查传到Action中得token,从而防止多次提交  -->
    <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
    <!--令牌回话拦截器:作用与前一个基本类似,只是它把非法提供的数据保存在HttpSession中,不跳转到错误页面,再次生成与第一次相同的响应页面  -->
    <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
    <!--验证拦截器:通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验  -->
    <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
    <!--工作流拦截器:负责调用Action类中的validate方法,如果验证失败,则不执行业务方法,而是放回input的逻辑视图  -->
    <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
    <!-- 消息储存拦截器:在回话中为Action存储和检索消息、字段错误以及Action错误,该拦截器要求Action实现ValidationAware接口 -->
    <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
    <!--多选框拦截器:将没有选中的checkbox项设置为false,协助管理多选框。在HTTP请求里,那些没有被选中的项通常没有任何值  -->
    <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
    <!--概要拦截器:允许Action记录简单的概要信息  -->
    <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
    <!--角色拦截器:JAAS(Java Authentication and Authorization Service, java 授权和认证服务)拦截器,只有当浏览器取得合适的授权后,才可以调用被拦截器拦截的Action  -->
    <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
    <!--json拦截器:验证失败时,可以将fieldError和actionErrors信息序列化为json,并返回给客户端  -->
    <interceptor name="jsonValidation" class="org.apache.struts2.interceptor.validation.JSONValidationInterceptor" />
    <!--注解工作流程拦截器:利用注解代替XML配置,使用该拦截器时可以使用@After、@Before,@BeforeResult等注解,执行流程为:before-execute-beforeResult-after顺序  -->
    <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
    <!--  -->
    <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
</interceptors>

自定义拦截器

1、编写拦截器类

  • a、自定义拦截器类必须实现Interceptor接口或者继承AbstractInterceptor类并实现其中的interceptor方法。
  • b、参数ActionInvocation是被拦截Action的一个引用,可以通过参数的invoke()方法,将控制权传递给下一个拦截器或者Action

2、拦截器的配置

  • a、配置参考项目里面的默认配置文件
  • b、可以通过<param name="key"> value</param>
    为拦截器设定多个参数,在拦截器类中通过setXxx()/getXxx()方法获取参数。
  • c、拦击器栈的配置如:
<interceptor-stack name="i18nStack">
    <interceptor-ref name="i18n"/>          <!--向拦截器栈中添加拦击器 -->
    <interceptor-ref name="basicStack"/>    <!-- 添加另一个拦击器栈 -->
</interceptor-stack>
  • d、应用拦截器到Action中:<interceptor-ref name="i18nStack">
    在struts.xml的Action配置即可。
  • c、如果使用了自定义拦截器默认的<interceptor-ref name="defaultStack"/>将会失效,需要重新配置。

注:在Action中配置拦截器时要注意拦截器的配置顺序,Struts 2会按照在xml中的配置顺序执行拦击器。

拦截器的使用

1、方法过滤拦截器使用;

  • a、通过继承MethodFilterInterceptor类,并实现相应的方法可以实现对Action中方法的过滤
  • b、在struts.xml中配置拦截器 通过<param>标签传递参数

拦截器类程序代码:

package hl.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class MyMethodFileterInterceptor extends MethodFilterInterceptor{

    @Override
    public void setExcludeMethods(String excludeMethods) {
        // TODO Auto-generated method stub
        super.setExcludeMethods(excludeMethods);
    }

    @Override
    public void setIncludeMethods(String includeMethods) {
        // TODO Auto-generated method stub
        super.setIncludeMethods(includeMethods);
    }

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub

        System.out.println("逻辑的实现过程是一样的只不过换了个名字而已");
        String returnString = invocation.invoke();
        System.out.println("拦击器链返回时调用     执行后完成后的调用");


        return returnString;
    }

}

struts.xml中的配置

<interceptors>
    <interceptor name="myMethodFileterInterceptor" class="hl.interceptor.MyMethodFileterInterceptor">
        <!--excludeMethods指定不需要拦截的方法  -->
        <param name="excludeMethods">register</param>
        <!--includeMethods指定需要拦截的方法  -->
        <param name="includeMethods">login</param>
    </interceptor>
</interceptors>

最后在Action配置中应用该拦截器即可。

注:如果excludeMethods和includeMethods的参数中设置了同一个参数就会出现冲突,则以includeMethods中的设置为准。

2、Token Interceptor 和 Token Session Interceptor 的使用(两者都继承了MethodFilterInterceptor拦截器,可以进行方法的过滤拦截)

  • 作用:防止表单的重复提交(double_submit)
  • 原理:JSP使用<s:token/>标签的时候,Struts2会建立一个GUID(全局唯一的字符串)放在session中,并且会添加一个hidden域将GUID放在form中。token拦截器会判断客户端form提交的token和session中保存的token是否相同。如果相同则执行Action。并删除session中的当前GUID以防重复提交。否则拦截器直接返回invaid.token结果,Action对应的方法也不会执行。 Token Session Interceptor继承了Token Interceptor并对其进行了优化,如果重复提交表单的话,将会直接跳转到第一次成功提交的页面。对应的Action类并不会被重复执行。
  • 使用方法:
    1、需要在form表单中加入<s:token/>标签。用于保存服务器生成的token值
    2、在struts.xml中配置拦截器 如:
<!--在对应的Action中配置防止表单重复提交拦截器token和invalid.token对应的视图  -->

<interceptor-ref name="tokenSession"/>  <!--使用Token Session Interceptor拦截器 --><interceptor-ref name="token">          <!--使用Token  Interceptor拦截器 -->
<param name="excludeMethods">login</param> <!-- 配置不进行拦截的方法 -->
</interceptor-ref> 

<result name="invalid.token">dbsubmitError.jsp</result> <!-- 重复提交时跳转的视图-->

应用场景:参考请参考使用Struts的Token机制解决表单的重复提交

总结

拦截器是Struts 2 的核心,大部分的功能都是通过拦截器来实现的。通过拦截器我们可以容易的实现网站的国际化、访问权限控制、double-submit的拦截等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值