【问题标题】:Struts2 multiple forms with token not working. Only one token at a time working带有令牌的 Struts2 多个表单不起作用。一次只能使用一个令牌
【发布时间】:2017-11-10 17:17:34
【问题描述】:

我正在尝试在 struts2 中开发一个应用程序,其中我有多种形式,可能有也可能没有相同的动作。为了避免 CSRF,我还使用这些表单添加了令牌,但一次只能使用一个令牌。如果我单击另一个提交按钮,那么我将重定向到为 CSRF 配置的错误页面。我被困在这里为什么会发生这种情况,无法在同一页面上使用多个令牌,或者有任何解决方案。

请找到我配置的struts2.xml代码。

<action name="expUsers" class="com.org.action.ExpUser">
   <interceptor-ref name="CSRFStack"/>
   <result name="invalid.token" type="tiles">csrfError</result>
   <result name="success" type="stream">
       <param name="contentDisposition">contentDisposition</param>
       <param name="contentType">application/octet-stream</param>
       <param name="inputName">inputStream</param>
   </result>
   <result name="failed" type="chain">csrfError</result>             
</action>

我在下面有以下虚拟表单示例,可以让您了解我在做什么。

<form id="form-1">
<s:token/>
....
</form>

<form id="form-2">
<s:token/>
....
</form>

<form id="form-3">
<s:token/>
....
</form>

... so on multiple forms with token.

【问题讨论】:

  • @Monoj 我认为由于令牌是唯一的(对于每个请求)...对于该令牌,只会接受一次提交或请求!这就是不允许对一个令牌的多次请求:) :)
  • 您不应该对两种表单使用相同的标记。
  • 然后如何为每个表单生成不同的令牌,因为无论我有什么表单,我为每个表单生成新的令牌。我将有多个基于数据库记录的表单。
  • 如果用户返回并点击另一个表单,那么在第一次请求使用令牌后表单应该可以工作。
  • 通过浏览器返回按钮返回?第一种形式也应该起作用吗?不要忘记提及他人,以便他们可以收到@ManojSharma 的通知。

标签: java struts2


【解决方案1】:

感谢大家给我的建议。我找到了一个可行的解决方案,所以我正在回答我自己的问题。

当我们生成&lt;s:token/&gt; 时,隐藏字段将像这样生成:-

<input type="hidden" name="struts.token.name" value="token">
<input type="hidden" name="token" value="1IPDKJ3QWM8X4JXAV0RKC0A9XVQ4I83E">

这是默认行为。现在,如果我想为每个 struts2 令牌标签生成不同的令牌,那么我必须像这样指定令牌的唯一名称:-

<s:token name="unique-1"/> 

然后它会生成这样的隐藏字段:-

<input type="hidden" name="struts.token.name" value="unique-1">
<input type="hidden" name="unique-1" value="1IPDKJ3QWM8X4JXAV0RKC0A9XVQ4I83E">

现在我有两个不同的令牌用于同一页面中的两种不同形式,并且在编写此答案时,这个技巧也可以完美运行,没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2016-08-21
    • 2018-06-05
    相关资源
    最近更新 更多