Java Struts2多个表单,令牌不起作用。一次只能使用一个令牌

Java Struts2多个表单,令牌不起作用。一次只能使用一个令牌,java,struts2,Java,Struts2,我正在尝试在struts2中开发一个应用程序,其中我有多个表单,可能有也可能没有相同的操作。为了避免CSRF,我还在这些表单中添加了令牌,但一次只能添加一个令牌。若我点击了另一个提交按钮,那个么我将重定向到错误页面,该页面是为CSRF配置的。我被困在这里,为什么会发生这种情况,我不能在同一页上使用多个令牌,或者是否有任何解决方案 请查找我配置的struts2.xml代码 <action name="expUsers" class="com.org.action.ExpUser">

我正在尝试在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>

csrfError
内容配置
应用程序/八位字节流
输入流
csrfError
我有下面的虚拟表单示例,可以让您了解我在做什么

<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.

....
....
....
... 因此,在多个表单上使用token。

谢谢大家给我的建议。我已经找到了一个有效的解决方案,所以我要回答我自己的问题

当我们生成
时,隐藏字段将如下生成:-

<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">


现在,我在同一页中有两个不同的令牌,用于两种不同的表单,在编写此答案时,这些技巧也可以完美地工作,没有任何问题。

@Monoj我认为,由于令牌是唯一的(对于每个请求)…该令牌只会接受一次提交或请求!这就是一个令牌的多个请求是不允许的:):)你不应该对两个表单使用相同的令牌。那么如何为每个表单生成不同的令牌,就像我拥有的任何表单一样,我需要为每个表单生成新的令牌。我将有基于数据库记录的多个表单。如果用户返回并单击另一个表单,则表单应在第一次请求时使用令牌后工作。是否通过浏览器返回按钮返回?第一种形式也适用吗?别忘了提到人们,这样他们就可以得到@ManojSharma的通知。