zoukankan      html  css  js  c++  java
  • 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>  
    

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

  • 相关阅读:
    PHP 上传文件 function move_uploaded_file: failed to open stream
    python super() 方法使用
    python 负数转为无符号整数
    python Aes 加密 解密
    mongoDB 启动 Error: couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91
    ansible使用
    字段类型binary
    7-14 求整数段和
    7-13 日K蜡烛图
    7-12 两个数的简单计算器
  • 原文地址:https://www.cnblogs.com/jimloveq/p/10609477.html
Copyright © 2011-2022 走看看