2

当我使用时,我正在测试令牌的不同场景并遇到此问题:

<action name="sincronizar" class="action.SincronizarAction">
        <interceptor-ref name="token"/>
        <interceptor-ref name="mystack"/>   
        <result name="success" type="tiles">d_sincronizar</result>
        <result name="input" type="tiles">d_sincronizar</result>
        <result name="invalid.token" type="tiles">d_sincronizar</result>
    </action>   

在控制台中出现此错误:

WARNING: Error setting expression 'struts.token' with value '[Ljava.lang.String;@3584de'
ognl.OgnlException: target is null for setProperty(null, "token",      
[Ljava.lang.String;@3584de)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2312)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)

现在我用“basicStack”重拍:

<action name="sincronizar" class="action.SincronizarAction">
        <interceptor-ref name="token"/>
        <interceptor-ref name="basicStack"/>    
        <result name="success" type="tiles">d_sincronizar</result>
        <result name="input" type="tiles">d_sincronizar</result>
        <result name="invalid.token" type="tiles">d_sincronizar</result>
    </action>   

而不是问题。但我需要使用我的堆栈。另外,当我使用相同的拦截器制作新堆栈时,也会遇到同样的问题。示例:lowStack 相同的 basicStack http://struts.apache.org/development/2.x/docs/interceptors.html

<interceptor-stack name="lowStack">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="servletConfig"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="multiselect"/>
            <interceptor-ref name="actionMappingParams"/>
            <interceptor-ref name="params"/>
            <interceptor-ref name="conversionError"/>
     </interceptor-stack>

<action name="sincronizar" class="action.SincronizarAction">
        <interceptor-ref name="token"/>
        <interceptor-ref name="lowStack"/>  
        <result name="success" type="tiles">d_sincronizar</result>
        <result name="input" type="tiles">d_sincronizar</result>
        <result name="invalid.token" type="tiles">d_sincronizar</result>
    </action>   

我也有同样的问题。

4

2 回答 2

1

发生这种情况是因为您缺少拦截器的excludeParams参数。params它应该看起来像这样:

<interceptor-ref name="params">
  <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>

看一下拦截器是在struts-default.xml哪里basicStack定义的。

于 2013-10-12T09:47:59.957 回答
1

老问题,但我遇到了这个问题并且 excludeParams 没有工作。在测试我的应用程序时,表单上的双重提交仍然是一个问题。

问题的解决方案是更深入地考虑信息。Struts 试图设置该值,它并不意味着在表单上,​​它意味着在动作控制器 java 对象中。因此,只需为 String 令牌添加一个 set/get。

在动作类中添加:

String token;
public void setToken(String token) { this.token = token; }
public String getToken() { return token; }

很确定这就是问题所在。使用排除参数只是隐藏它,防止拦截器尝试访问代码库中缺少的方法。

这里也有一些很好的信息:

http://www.journaldev.com/2281/struts2-token-interceptor-to-handle-double-form-submission-problem#comment-30355

我发布了一些评论来扩展他的教程,等待版主批准,然后才能看到它们。

于 2014-10-03T13:38:17.143 回答