了解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的拦截等