使用带有验证拦截器的令牌拦截器的问题

时间:2014-04-15 18:40:52

标签: validation struts2 token form-submit

原因:事实证明,验证失败会导致令牌重置,如果表单提交的次数非常快,有时会导致表单令牌和htmlsession令牌不同。 (也许在页面加载后,用于设置令牌的线程仍然从双提交中运行,并在呈现jsp页面后更改了htmlsession中的令牌)。这就是为什么每次提交验证失败后令牌验证失败的原因。

必须调整令牌的设置方式。在此更新的主题中有关此内容的更多详细信息。

https://stackoverflow.com/questions/23301475/invalid-token-thrown-on-first-submit-by-tokensession

我正在开发一个同时使用令牌和验证拦截器的webapp。简要说明是使用<s:token/>在jsp页面中设置令牌,并在操作调用TokenHelper.validToken()上用于检查令牌是否有效。当用户发送多个帖子或表单提交并且validateSave()失败时,就会出现此问题。用户被发送回表单页面。在此之后,即使用户仅提交一次,也会导致无效的令牌。表单中的隐藏令牌和“actionSession”中的令牌(我不知道确切的名称,但它是保存令牌的副本以供将来比较的地方。)与结果不一样首次提交时,在无效令牌中。我遇到了麻烦以及如何处理这个事件。

非常感谢任何意见。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果您正在使用令牌拦截器,则根本不需要检查令牌是否有效。令牌拦截器为我们和它做了它如果令牌无效,它只返回一个结果,即“invalid.token”。我们想要做的是,只需将结果“invalid.token”的操作配置到您想要的页面。不要忘记添加interceptor-ref。检查下面给出的配置代码。

<action name="yourAction" class="com.YourActionClass">
    <interceptor-ref name="token"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <result name="success">/success.jsp</result>
    <result name="input">/update.jsp</result>
    <result name="invalid.token">/invalid_token.jsp</result>
</action>

如果要在刷新或重新提交表单时向用户显示上一个操作的结果页面而不再次调用操作,则可以使用tokenSession拦截器,如下所示。

<action name="yourAction" class="com.YourActionClass">
    <interceptor-ref name="tokenSession"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <result name="success">/success.jsp</result>
    <result name="input">/update.jsp</result>
</action>

希望这会对你有所帮助。