我继承了一些代码,现在我必须在其中添加 CSRF 预防,并尝试使用 struts2 tokenSession 拦截器来执行此操作。我正在使用 struts2 令牌标记向我的表单添加一个令牌,如下所示:
<form id="updateObject" name="updateObject" action="<%=request.getContextPath()%>/prv/updateObject.action" method="POST">
<fieldset class="x-fieldset">
<legend>Update object - Action Required</legend>
<div>...</div>
<s:token />
<s:hidden name="id" id="objectId" />
more stuff here...
<input type="submit" value="Update Object" onclick="javascript:return doUpdateObject('myAction');"/>
</fieldset>
</form>
在我的 javascript 函数中,我正在添加/删除一些验证规则(取决于所需的操作,并提交表单:
function doUpdateObject(action){
actionPanel.registerAction(action); // this function places the action name in an in-scope variable
doUpdateObjectValidationSetup(action); // this function adds/removes jquery validation rules depending upon the action
if($("#updateObject").valid()){
$("form#updateObject").submit();
}
return false;
}
我已经拦截了请求并且正在添加一个令牌,但是 struts2 tokenSession 拦截器正在返回 invalid.token。没有此拦截器,代码按预期工作。(未发布 struts2 xml 文件 - 如果需要,将发布相关部分)。我还在其他使用基本 html 提交按钮(即不通过 javascript 或 jquery)的页面中使用了 tokenSession 拦截器,这也可以按预期工作。是什么使令牌无效?
NB 我继承的项目使用了标准 html、struts2 标签、ExtJS 和 JQuery 的奇怪混合。我会在某个时候清理它,但目前我只需要让 tokenSession 拦截器按原样在代码中尽快工作(因为我必须对数百页应用类似的修复......)。
非常感谢任何帮助/指针/提示/等!
问候,
约翰