使用struts2,拦截器大家经常使用,当然默认情况我们除了自定义的拦截器外,会使用struts2默认的拦截器,那他究竟有哪些默认的拦截器?每个拦截器都是做什么的呢?我们来看下对应的源码,打开对应源码下的struts2-default.xml文件< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

我们可以看到对应很多的拦截器信息,如下
拦截器信息:
<interceptors>
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
<interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
<interceptor name="externalRef" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>
<interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
<interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
<interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
<interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
<interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
<interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
<interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
<interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
<interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
<!-- Deprecated name forms scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 -->
<interceptor name="external-ref" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>
<interceptor name="model-driven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor name="static-params" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
<interceptor name="scoped-model-driven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
<interceptor name="servlet-config" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<interceptor name="token-session" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
拦截器栈信息:
<!-- Basic stack -->
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
<!-- Sample validation and workflow stack -->
<interceptor-stack name="validationWorkflowStack">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
<!-- Sample file upload stack -->
<interceptor-stack name="fileUploadStack">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="basicStack"/>
</interceptor-stack>
<!-- Sample model-driven stack -->
<interceptor-stack name="modelDrivenStack">
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="basicStack"/>
</interceptor-stack>
<!-- Sample action chaining stack -->
<interceptor-stack name="chainStack">
<interceptor-ref name="chain"/>
<interceptor-ref name="basicStack"/>
</interceptor-stack>
<!-- Sample i18n stack -->
<interceptor-stack name="i18nStack">
<interceptor-ref name="i18n"/>
<interceptor-ref name="basicStack"/>
</interceptor-stack>
<!-- An example of the params-prepare-params trick. This stack
is exactly the same as the defaultStack, except that it
includes one extra interceptor before the prepare interceptor:
the params interceptor.
This is useful for when you wish to apply parameters directly
to an object that you wish to load externally (such as a DAO
or database or service layer), but can't load that object
until at least the ID parameter has been loaded. By loading
the parameters twice, you can retrieve the object in the
prepare() method, allowing the second params interceptor to
apply the values on the object. -->
<interceptor-stack name="paramsPrepareParamsStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="params"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
</interceptor-stack>
<!-- A complete stack with all the common interceptors in place.
Generally, this stack should be the one you use, though it
may do more than you need. Also, the ordering can be
switched around (ex: if you wish to have your servlet-related
objects applied before prepare() is called, you'd need to move
servlet-config interceptor up.
This stack also excludes from the normal validation and workflow
the method names input, back, and cancel. These typically are
associated with requests that should not be validated.
-->
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
<!-- The completeStack is here for backwards compatibility for
applications that still refer to the defaultStack by the
old name -->
<interceptor-stack name="completeStack">
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
<!-- Sample execute and wait stack.
Note: execAndWait should always be the *last* interceptor. -->
<interceptor-stack name="executeAndWaitStack">
<interceptor-ref name="execAndWait">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="execAndWait">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
</interceptor-stack>
<default-interceptor-ref name="defaultStack"/>
注:因博文字数限制,剩余部分请参见下面的链接
下文请参见Struts2默认拦截器解析(二)
http://yhjhappy234.blog.163.com/blog/static/31632832201181174448562/
注:因博文字数限制,上文部分请参见《Struts2默认拦截器解析(一) 》
http://yhjhappy234.blog.163.com/blog/static/3163283220118117525758/
(续上文)
当然还有很多拦截器栈,我们先来看拦截器
拦截器名< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> | AliasInterceptor | 【别名拦截器】 |
配置名 | alias | |
描述 | 允许参数在跨越多个请求时使用不同别名,这个拦截器可将多个action使用不同名字链接起来,然后用于处理同一信息 | |
对应的类 | com.opensymphony.xwork2.interceptor.AliasInterceptor | |
拦截器名 | ActionAutowiringInterceptor | 【自动装配拦截器】 |
配置名 | autowiring | |
描述 | 信息自动装配的拦截器,主要用于当struts2和Spring整合时,Struts可以使用自动装配的方式来访问Spring容器中的Bean. | |
对应的类 | com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor | |
拦截器名 | ChainingInterceptor | 【链拦截器】 |
配置名 | chain | |
描述 | 允许当前action能够使用上一个被执行action的属性,这个拦截器通常要和“chain”结果类型一起使用(<result type=”chain”…/>) | |
对应的类 | com.opensymphony.xwork2.interceptor.ChainingInterceptor | |
拦截器名 | Checkbox Interceptor | 【多选框拦截器】 |
配置名 | checkbox | |
描述 | 为没有被选定的多选框增加一个值为false的参数,协助管理多选框(在HTTP请求里,那些没有被选定的多选框通常是没有任何信息的) | |
对应的类 | org.apache.struts2.interceptor.CheckboxInterceptor | |
拦截器名 | ConversionErrorInterceptor | 【转换错误拦截器】 |
配置名 | conversionError | |
描述 | 将转换错误的信息(包括转换的字符串和参数类型等)存放到action的字段错误集里去 | |
对应的类 | org.apache.struts2.interceptor.StrutsConversionErrorInterceptor | |
拦截器名 | CookieInterceptor | 【Cookie拦截器】 |
配置名 | cookie | |
描述 | 使用配置的name,value来指定cookies | |
对应的类 | org.apache.struts2.interceptor.CookieInterceptor | |
拦截器名 | ClearSessionInterceptor | 【清除Session拦截器】 |
配置名 | clearSession | |
描述 | 负责销毁HttpSeesion | |
对应的类 | N/A | |
拦截器名 | CreateSessionInterceptor | 【会话创建拦截器】 |
配置名 | createSession | |
描述 | 自动创建一个HttpSession会话(如果会话不存在),用来为需要使用到HttpSession的拦截器服务 | |
对应的类 | org.apache.struts2.interceptor.CreateSessionInterceptor | |
拦截器名 | DebuggingInterceptor | 【调试拦截器】 |
配置名 | debugging | |
描述 | 当使用Struts2的开发模式时,此拦截器会提供更多的调试信息,为开发者提供几种不同调试界面 | |
对应的类 | org.apache.struts2.interceptor.debugging.DebuggingInterceptor | |
拦截器名 | ExternalReferencesInterceptor | 【扩展引用拦截器】 |
配置名 | externalRef | |
描述 | 负责扩展引用 | |
对应的类 | com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor | |
拦截器名 | ExecuteAndWaitInterceptor | 【执行和等待拦截器】 |
配置名 | execAndWait | |
描述 | 当action在后台执行时,给用户显示一个过渡性的等待页面 | |
对应的类 | org.apache.struts2.interceptor.ExecuteAndWaitInterceptor | |
拦截器名 | ExceptionMappingInterceptor | 【异常拦截器】 |
配置名 | exception | |
描述 | 将action抛出的异常映射到结果,这样就通过重定向来自动处理异常,一般情况下,应该为最后一个拦截器 | |
对应的类 | com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor | |
拦截器名 | FileUploadInterceptor | 【文件上传拦截器】 |
配置名 | fileUpload | |
描述 | 此拦截器主要用于文件上传,它负责解析表单中文件域的内容 | |
对应的类 | org.apache.struts2.interceptor.FileUploadInterceptor | |
拦截器名 | Internatio-nalization Interceptor | 【国际化拦截器】 |
配置名 | i18n | |
描述 | 这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。 | |
对应的类 | com.opensymphony.xwork2.interceptor.I18nInterceptor | |
拦截器名 | Logging Interceptor | 【日志拦截器】 |
配置名 | logger | |
描述 | 通过输出被执行action的名字,提供简单的日志功能,记录用于追踪的信息(可位于拦截器序列的不同位置) | |
对应的类 | com.opensymphony.xwork2.interceptor.LoggingInterceptor | |
拦截器名 | Message Store Interceptor | 【消息存储拦截器】 |
配置名 | store | |
描述 | 在会话中为action存储和检索消息、字段错误以及action错误,该拦截器要求action实现ValidationAware接口 | |
对应的类 | org.apache.struts2.interceptor.MessageStoreInterceptor | |
拦截器名 | Model Driven Interceptor | 【模型驱动拦截器】 |
配置名 | modelDriven | |
描述 | 这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果放入ValueStack中 | |
对应的类 | com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor | |
拦截器名 | Scoped Model Driven Interceptor | 【作用域模型驱动拦截器】 |
配置名 | scopedModelDriven | |
描述 | 如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例 | |
对应的类 | com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor | |
拦截器名 | Parameters Interceptor | 【参数拦截器】 |
配置名 | params | |
描述 | 这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值 | |
对应的类 | com.opensymphony.xwork2.interceptor.ParametersInterceptor | |
拦截器名 | Parameter Filter Interceptor | 【参数过滤拦截器】 |
配置名 | N/A | |
描述 | 控制action对参数的访问(非默认配置) | |
对应的类 | org.apache.struts2.interceptor.ProfilingActivationInterceptor | |
拦截器名 | Prepare Interceptor | 【预备拦截器】 |
配置名 | prepare | |
描述 | 如果action实现Preparable接口,将会调用该拦截器的prepare()方法 | |
对应的类 | com.opensymphony.xwork2.interceptor.PrepareInterceptor | |
拦截器名 | Profiling Interceptor | 【概要拦截器】 |
配置名 | profiling | |
描述 | 允许action记录简单的概要信息日志 | |
对应的类 | com.opensymphony.xwork2.interceptor.StaticParametersInterceptor | |
拦截器名 | Scope Interceptor | 【作用域拦截器】 |
配置名 | scope | |
描述 | 这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。 | |
对应的类 | org.apache.struts2.interceptor.ScopeInterceptor | |
拦截器名 | Servlet Configuration Interceptor | 【Servlet配置拦截器】 |
配置名 | servletConfig | |
描述 | 如果某个Action需要直接访问ServletAPI,就是通过这个拦截器实现,它提供访问HttpServletRequest和HttpServletResponse的方法,以map的方式访问 | |
对应的类 | org.apache.struts2.interceptor.ServletConfigInterceptor | |
拦截器名 | Static Parameters Interceptor | 【静态参数拦截器】 |
配置名 | staticParams | |
描述 | 设置action里的静态定义值(通过action配置里的param标签来实现);这个拦截器负责将struts.xml文件中<action>标签下<param>标签中的参数传入action | |
对应的类 | com.opensymphony.xwork2.interceptor.StaticParametersInterceptor | |
拦截器名 | Roles Interceptor | 【角色拦截器】 |
配置名 | roles | |
描述 | 这是一个JAAS(Java Authentication and Authorization Service, Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action | |
对应的类 | org.apache.struts2.interceptor.RolesInterceptor | |
拦截器名 | Timer Interceptor | 【计时拦截器】 |
配置名 | timer | |
描述 | 以执行action所花时间的形式,简单记录action概要信息,此拦截器负责输出Action的执行时间,可以利用此拦截器分析该Action的性能瓶颈 | |
对应的类 | com.opensymphony.xwork2.interceptor.TimerInterceptor | |
拦截器名 | Token Interceptor | 【令牌拦截器】 |
配置名 | token | |
描述 | 检查action的合法令牌,以防止重复提交表单,当表单被多次提交时,跳转到一个错误页面 | |
对应的类 | org.apache.struts2.interceptor.TokenInterceptor | |
拦截器名 | Token Session Interceptor | 【令牌会话拦截器】 |
配置名 | tokenSession | |
描述 | 功能与令牌拦截器相同,但是对于非法令牌,提交的数据将保存在会话中,不跳转到错误页面,再次生成与第一次相同的页面。 | |
对应的类 | org.apache.struts2.interceptor.TokenSessionStoreInterceptor | |
拦截器名 | ValidationInterceptor | 【验证拦截器】 |
配置名 | validation | |
描述 | 通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。 | |
对应的类 | org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor | |
拦截器名 | Workflow Interceptor | 【工作流拦截器】 |
配置名 | workflow | |
描述 | 为action定义默认的工作流,一般跟在validation等其他拦截器后,当验证失败时,不执行action然后重定向到INPUT视图 | |
对应的类 | com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor | |
拦截器名 | JsonValidationInterceptor | 【Json拦截器】 |
配置名 | jsonValidation | |
描述 | 验证失败,此拦截器可以将fieldErrors和actionErrors两个属性给序列化成json返回给客户端 | |
对应的类 | com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor |
以上就是struts2默认的拦截器,我们大部分时间是不需要单独配置这些拦截器的,一般都是配置对应的拦截器栈,下面我们来看对应的拦截器栈都有哪些?都是做什么的?
已配置栈名 | 包含的拦截器 | 描 述 |
basicStack | exception、servletConfig、prepare、checkbox、params、conversionError | 如使用栈,最起码要使用这几个拦截器 |
validationWorkflowStack | basicStack、validation、workflow | 在基本栈的基础上增加验证和工作流特性 |
fileUploadStack | fileUpload、basicStack | 在基本栈的基础上增加文件上传特性 |
modelDrivenStack | modelDriven、basicStack | 在基本栈的基础上增加模型功能特性 |
chainStack | chain、basicStack | 在基本栈的基础上增加链接特性 |
i18nStack | i18n、basicStack | 在基本栈的基础上增加区域持久化特性 |
paramPrepareParamsStack | exception、alias、params、servletConfig、prepare、i18n、chain、modelDriven、file- Upload、checkbox、staticParams、params、conversionError、vali- dation、workflow | 提供包括前action(pre-action)方法调用的完整栈。params栈使用两次:第一次是在调用prepare()方法之前提供参数,第二次是在预备阶段为可能被检索的对象重新使用参数 |
defaultStack | exception、alias、servlet- Config、prepare、i18n、chain、debugging、profiling、scoped- ModelDriven、modelDriven、fileUpload、checkbox、static- Params、params、conversion- Error、validation、workflow | 提供一个完整栈,包括调试和概要 |
executeAndWaitStack | execAndWait、defaultStack、execAndWait | 提供执行与等待栈,比如在上传文件时需要向用户显示一个等待页面时,就可以使用这个栈 |
如果不配置拦截器,默认使用他自己的defaultStack,我们看到,defaultStack包含了基本上所有的拦截器,所以基本上都能满足我们的需求,但是我们一般情况下用不了这么多拦截器栈的,经过这么多拦截器栈肯定会影响性能的,所以我们可以根据不通的场景,选择合适的拦截器栈。如下面的action只需要上传,那我们只需要添加上次的拦截器即可!
<?xml version="1.0" encoding="UTF-8"?>< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="upload" namespace="/front/upload" extends="struts-default">
<!-- 对应报下面值包含fileUploadStack拦截器栈 -->
<default-interceptor-ref name="fileUploadStack"></default-interceptor-ref>
<action name="upload" class="com.shunwang.passport.actu.web.ActuUploadAction">
</action>
</package>
</struts>