我在 Struts 2 中使用令牌来防止跨站点请求伪造 (CSRF)。
如果我在我的 JSP 页面中添加令牌,它会生成如下 HTML 代码:
<input type="hidden" value="token" name="struts.token.name">
<input type="hidden" value="6AM02LV6P4R9UR5P3LOI62XG87SEQYIT" name="token">
我想在提交表单时在我的操作中获取令牌值?我怎样才能得到它?
我在 Struts 2 中使用令牌来防止跨站点请求伪造 (CSRF)。
如果我在我的 JSP 页面中添加令牌,它会生成如下 HTML 代码:
<input type="hidden" value="token" name="struts.token.name">
<input type="hidden" value="6AM02LV6P4R9UR5P3LOI62XG87SEQYIT" name="token">
我想在提交表单时在我的操作中获取令牌值?我怎样才能得到它?
如果您询问如何从客户端将令牌值发送到 Action 以确保这不是 CSRF,您可以通过表单提交发送它,或者将令牌添加到您的请求参数中。
选项 1) 这仅在您在 jsp 页面中使用 as: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>
方案二 通过“s:token”标签获取struts生成的token号,将token值插入到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 拦截,如果给定的令牌等于会话中存储的令牌,它将执行该操作。请记住,您不能两次使用相同的令牌处理请求。实际上令牌拦截器会在使用后从会话参数中删除令牌变量。要运行另一个请求,您必须确保在服务器端生成了一个新令牌。
希望这对你有用!
尝试这个:
String tokenName = TokenHelper.getTokenName();
String tokenVal = TokenHelper.getToken();
System.out.println("tokenName: " + tokenName + "tokenVal: " + tokenVal);