struts2 解决拦截器的对于参数传递无效问题

struts2 解决拦截器的对于参数传递无效问题

一、今天做项目时,使用拦截器对用户权限检查。拦截器本身没有问题,可是实现权限拦截,但是传递的参数全部都无效了。搞了很久,由于对拦截器的内部机制不是特别熟悉,所以重新研读了一下Struts2的拦截器。找到了原因:给一个Acton配置一个自定义拦截器后,此action就无法使用框架默认的拦截器栈了,这就导致前后台数据传输无效。

使用的配置如下:

<action name="GeneralInfo" class="com.csl.mms.action.GeneralInfo">
	<interceptor-ref name="corporationInterceptor"></interceptor-ref>
	<result name="success">general_info.jsp</result>
</action>

通过添加另一个设置,发现可以正常传参,配置如下:

<action name="GeneralInfo" class="com.csl.mms.action.GeneralInfo">
	<interceptor-ref name="corporationInterceptor"></interceptor-ref>
	<interceptor-ref name="params">
		<param name="excludeParams">dojo\..*,^struts\..*</param>
	</interceptor-ref>
	<result name="success">general_info.jsp</result>
</action>

二、通过请求调用Action的setter方法(params)

当客户端的一个form向服务端提交请求时,如有一个textfield,代码如下: 

Jsp代码
“first” namespace="/test">
“name”/>

在提交后,Struts2将会自动调用first动作类中的setName方法,并将name文本框中的值通过setName方法的参数传入。实际上,这个操作是由params拦截器完成的,params对应的类是com.opensymphony.xwork2.interceptor.ParametersInterceptor。由于params已经在defaultStack中定义,因此,在未引用拦截器的中是会自动引用params的,如下面的配置代码,在访问first动作时,Struts2是会自动执行相应的setter方法的。

但如果在中引用了其他的拦截器,就必须再次引用params拦截器,Struts2才能调用相应的setter方法。如下面的配置代码所示:
Xml代码

<</span>action name="first" class="action.FirstAction">  
    <</span>interceptor-ref name="timer" />  
    <</span>interceptor-ref name="params"/>  
</</span>action>  

三、通过配置参数调用Action的setter方法(static-params)

static-params拦截器可以通过配置标签来调用Action类的相应的setter方法,static-params拦截器对应的类是com.opensymphony.xwork2.interceptor.StaticParametersInterceptor。
下面配置代码演示了如何使用static-params拦截器:

Xml代码

<</span>action name="first" class="action.FirstAction">  
    <</span>interceptor-ref name="timer" />  
    <</span>param name="who">比尔</</span>param>  
    <</span>interceptor-ref name="params"/>  
    <</span>interceptor-ref name="static-params"/>  
</</span>action>  

如果first动作使用上面的配置,在访问first动作时,Struts2会自动调用setWho方法将“比尔”作为参数值传入setWho方法。

四、使用拦截器栈

为了能在多个动作中方便地引用同一个或几个拦截器,可以使用拦截器栈将这些拦截器作为一个整体来引用。拦截器栈要在标签中使用和子标签来定义。代码如下:
Xml代码

<</span>package name="demo" extends="struts-default" >  
    <</span>interceptors>  
        <</span>interceptor-stack name="mystack">  
            <</span>interceptor-ref name="timer" />  
            <</span>interceptor-ref name="logger" />  
            <</span>interceptor-ref name="params" />  
            <</span>interceptor-ref name="static-params" />  
        </</span>interceptor-stack>  
    </</span>interceptors>  
  
    <</span>action name="first" class="action.FirstAction">  
        <</span>param name="who">比尔</</span>param>  
        <</span>interceptor-ref name="mystack"/>              
    </</span>action>  
</</span>package>  

这样以来,我们就可以象使用拦截器一样使用拦截器栈。

posted @ 2019-03-27 09:33  Jim~Liang  阅读(709)  评论(0编辑  收藏  举报