拦截器是struts2框架的重要组成部分,在struts2中的大量工作都是由拦截器(interceptor)来完成
的。如params拦截器可以将HTTP请求中的参数信息解析出来封装在Action的属性中:fileUpload拦截器则负责分析HTTP请求中的文件块信息,并封装在Action相应的属性中……在struts2中像这样的内建拦截器还有很多,下面是struts-default.xml中定义的一些拦截器信息:在我的博客(Struts2拦截器)我们以此为例来说明如何定义和使用拦截器;拦截器中的方法过滤 ;在拦截器中配置结果监听器;struts2中常用内建监听器的使用,最后我们以权限验证拦截器为例说明如何自定义拦截器。来和我一起快乐的学习吧!
struts-default.xml中监听器的配置
<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="cookieProvider" class="org.apache.struts2.interceptor.CookieProviderInterceptor"/>
<interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
<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"/>
……
<!-- 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="datetime"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="deprecation"/>
</interceptor-stack>
<!-- Sample file upload stack文件上传拦截器栈 -->
<interceptor-stack name="fileUploadStack">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="basicStack"/><!--引用basicStack拦截器栈-->
</interceptor-stack>
<!-- defaultStack默认拦截器栈 -->
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="datetime"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params"/>
<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-ref name="debugging"/>
<interceptor-ref name="deprecation"/>
</interceptor-stack>
<!-- defaultStack被struts2设置为了默认拦截器栈,默认情况下所有HTTP请求都会通过这些拦截器 -->
<default-interceptor-ref name="defaultStack"/>
从struts-default.xml的拦截器配置中我们知道了struts2的一些内建拦截器以及这些拦截器(拦截器栈)是如何定义的,那么在struts.xml中应该如何使用这些拦截器呢?很简单
<struts>
<package name="user" extends="struts-default">
<!--拦截器的定义-->
<interceptors>
<interceptor name="executeTime" class="interceptor.ExecuteTime2Interceptor">
<param name="name">执行时间</param>
</interceptor>
<interceptor-stack name="customStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="executeTime" />
</interceptor-stack>
</interceptors>
<!--默认拦截器的设置,每个包只能有一个默认拦截器-->
<default-interceptor-ref name="默认调用的拦截器,如权限验证拦截器等"/>
<action name="login" class="action.LoginAction">
<result name="success">
/success.jsp
</result>
<!--拦截器栈的使用-->
<interceptor-ref name="customStack">
<!--注意指定拦截器参数值的方法-->
<param name="executeTime.name">自定义的计算excute执行时间的拦截器</param>
</interceptor-ref>
</action>
</package>
</struts>
注意:当在包中显示使用了其他拦截器(栈)时,默认的拦截器(栈)就不起作用了,因此struts-default.xml中一些拦截器都被封装成拦截器栈,引用了basicStack或defaultStack,因此显示调用时应该调用这些封装好的拦截器栈,例如
<interceptor-stack name="fileUploadStack">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="basicStack"/><!--引用basicStack拦截器栈-->
</interceptor-stack>
如果显示调用时直接调用fileUpload而不是fileUploadStack的话,就会导致basicStack中大多数Action都需要的拦截器都无法使用,直接导致HTTP请求无法解析。