获取令牌值

时间:2013-07-22 10:58:42

标签: struts2

我在Struts 2中使用令牌来阻止跨站点请求伪造(CSRF)。

如果我在JSP页面中添加令牌,它会生成HTML代码,如:

 <input type="hidden" value="token" name="struts.token.name">
 <input type="hidden" value="6AM02LV6P4R9UR5P3LOI62XG87SEQYIT" name="token">

我想在提交表单时在我的Action中获取令牌值?我怎么能得到它?

2 个答案:

答案 0 :(得分:0)

试试这个:

String tokenName = TokenHelper.getTokenName();
String tokenVal = TokenHelper.getToken();
System.out.println("tokenName: " + tokenName + "tokenVal: " + tokenVal);

答案 1 :(得分:0)

如果您要从客户端将令牌值发送到操作以确保它不是CSRF,则可以通过表单提交将其发送,也可以将令牌添加到您的请求参数中。

>

选项1) 仅当您在jsp页面中使用s:form元素时,此方法才有效。将 标记添加到s:form元素中。这将确保您的表单是使用生成的令牌提交的。

<s:form action="ProcessSimpleLogin">
   <s:textfield name="username" label="Username" />
   <s:password name="password" label="Password" />
   <s:token />
   <s:submit value="Login" />
</s:form>

选项2 通过“ s:token”标签获取由struts生成的令牌号,并将令牌值插入js变量:

<s:token />
<script>
    var strutsToken = "<s:property value="#session['struts.tokens.token']" />";
</script>

然后使用“ struts.token.name”和“ token”参数名称将该值添加到请求参数中。如果您是通过js构建paramString,则它看起来像这样:

    paramString = paramString + "&struts.token.name=token";
    paramString = paramString + "&token=" + strutsToken;

将生成类似于以下内容的参数字符串:

http://localhost:2000/namespace/action?username=denise&struts.token.name=token&token=6AM02LV6P4R9UR5P3LOI62XG87SEQYIT

您的请求将被TokenInterceptor拦截,如果给定的令牌等于会话中存储的令牌,它将执行操作。请记住,您不能使用相同的令牌两次处理请求。实际上,令牌拦截器在使用后会从会话参数中删除令牌变量。要运行另一个请求,必须确保在服务器端生成了新令牌。

希望这对您有用!