【问题标题】:Struts 2 sessionToken interceptor always redirects to errorStruts 2 sessionToken 拦截器总是重定向到错误
【发布时间】:2013-03-12 21:51:21
【问题描述】:

我一直试图让 tokenSession 拦截器工作(Struts 2.0.14),但总是收到警告:

2013-03-13 08:32:09,395 [17] DEBUG Intercepting invocation to check for valid transaction token. | org.apache.struts2.interceptor.TokenSessionStoreInterceptor.doIntercept(128)
2013-03-13 08:32:09,395 [17] WARN  Could not find token name in params. | org.apache.struts2.util.TokenHelper.getTokenName(124)
2013-03-13 08:32:09,396 [17] DEBUG no token name found -> Invalid token  | org.apache.struts2.util.TokenHelper.validToken(154)
2013-03-13 08:32:09,397 [17] WARN  Could not find token name in params. | org.apache.struts2.util.TokenHelper.getTokenName(124)
2013-03-13 08:32:09,397 [17] WARN  Could not find token mapped to token name null | org.apache.struts2.util.TokenHelper.getToken(105)
2013-03-13 08:32:09,398 [17] DEBUG Forwarding to location /WEB-INF/view/support/TokenError.jsp | org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(113)

struts.xml 有如下拦截器配置:

            <package name="survey" extends="struts-default">
        <result-types>
            <result-type name="csv"
                     class="webapp.CsvResultType"/>
            </result-types>

        <interceptors>
            <interceptor name="log"
                class="struts.LoggingInterceptor"/>
            <interceptor name="formAuthentication"
                class="security.FormAuthenticationInterceptor"/>
            <interceptor-stack name="default">
                <interceptor-ref name="log"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="formAuthentication"/>
                <!--interceptor-ref name="chain"/>-->
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="params"/>
            </interceptor-stack>
            <interceptor-stack name="defaultTokenStack">
                <interceptor-ref name="tokenSession"/>
                <interceptor-ref name="default"/>
            </interceptor-stack>

        </interceptors>

        <default-interceptor-ref name="default"/>

        <!--  -->

        <global-results>
             <result name="blank">/WEB-INF/view/support/Blank.jsp</result>
             <result name="error">/WEB-INF/view/support/Error.jsp</result>
             <result name="insufficientPrivileges">/WEB-INF/view/support/InsufficientPrivileges.jsp</result>
             <!--result name="file" type="file"></result-->
        </global-results>

    </package>

带有动作定义:

<package name="respondent" namespace="/respondent" extends="survey">
    <action name="*" class="controller.respondent.{1}Action">
        <interceptor-ref name="defaultTokenStack"/>
        <result name="list">/WEB-INF/view/respondent/{1}List.jsp</result>
        <result name="edit">/WEB-INF/view/respondent/{1}Edit.jsp</result>
        <result name="view">/WEB-INF/view/respondent/{1}View.jsp</result>
        <result name="success">/WEB-INF/view/respondent/{1}.jsp</result>
        <result name="invalid.token">/WEB-INF/view/support/TokenError.jsp</result>
    </action>
</package>

jsp有token标签:

<s:form action="FunctionSummary.action" method="post">
<s:token/>

    <table class="buttons">
        <tr>
            <s:if test="surveyStarted">
                <td><s:submit value="Resume Survey"/></td>
            </s:if>
            <s:else>
                <td><s:submit value="Start Survey"/></td>
            </s:else>

        </tr>
    </table>

</s:form>

对该页面的任何访问都会导致重定向到 invalid.token 结果和上述警告。

我已经验证,如果没有配置拦截器,页面源确实有令牌,但我无法让 sessionToken 拦截器看到它。

任何帮助将不胜感激......

谢谢

【问题讨论】:

  • 您使用的是非常旧的 Struts2 版本。升级到 2.3.8 版并重试。
  • “任何访问此页面”是什么意思?您是否使用此操作来显示此页面?令牌拦截器应在您提交的操作上配置。

标签: struts2 double-submit-prevention


【解决方案1】:

尝试将您的&lt;s:token/&gt; 标签放入您的&lt;table&gt; 标签中。 我遇到了和你一样的问题。在我将&lt;s:token/&gt; 放入&lt;table&gt; 标签后问题就解决了。

<s:form action="" id = "" theme="simple" method = "post">
<table id = "" border="1" width="200">
    <s:token/>  <!-- In the table tag -->

</table>
</s:form>

【讨论】:

  • &lt;s:token&gt; 标签必须在表单标签内。是否在table标签中并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多