0

我继承了一些代码,现在我必须在其中添加 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 拦截器按原样在代码中尽快工作(因为我必须对数百页应用类似的修复......)。

非常感谢任何帮助/指针/提示/等!

问候,

约翰

4

2 回答 2

0

你确定你没有生成两个提交吗?(查看您的网络服务器日志)

如果是这样,也许是因为:

onclick="javascript:return doUpdateObject('myAction');".

这是不正确的,伪协议javascript:应仅用于 url (ej href="...") 而不是事件处理程序。将其替换为onclick="return doUpdateObject('myAction')"

不过,我怀疑问题是由这个引起的。

于 2010-06-15T20:08:02.457 回答
0

这现在没有任何变化!只是做了一个完整的重建,缓存清理,重新启动等。不知道是什么导致了原始问题。很抱歉浪费时间。

约翰

于 2010-06-16T10:10:01.113 回答