2010-06-15 39 views
0

我繼承了一些代碼,現在我必須添加CSRF預防功能,並試圖使用struts2 tokenSession攔截器來執行此操作。我使用的是Struts2的記號標記,像這樣將令牌到我的表格:struts2 invalid.token在使用JQuery提交表單時返回

<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文件未發佈 - 將發佈相關部分if需要)我還在其他使用基本html提交按鈕的頁面中使用了tokenSession攔截器(即不去通過JavaScript或jQuery的ing),這也符合預期。什麼使令牌無效?

N.B.我繼承的項目使用了標準html,struts2標籤,ExtJS和JQuery的奇怪混合。我會在某個時候清理它,但目前我只需要讓代碼中的tokenSession攔截器儘快工作(因爲我必須對幾百頁應用類似的修復程序......)。

任何幫助/指針/技巧/等非常感謝!

問候,

約翰

回答

0

你確定你是不是產生兩個的提交? (看看你的Web服務器日誌)

如果是這樣,也許是因爲這個:

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

這是不正確的,僞協議javascript:應該只用於網址(ej href="...")不在事件處理程序。將其替換爲onclick="return doUpdateObject('myAction')"

雖然我懷疑問題是由此造成的。

+0

謝謝,但沒有兩個的提交也不會產生 - 正如我所說,我已經攔截檢查參數的要求,只有一個請求被髮送。儘管我已經刪除了'javascript:'。 – John 2010-06-16 07:51:32

0

這是現在沒有變化的工作!只是做了一個完整的重新構建,緩存清理,重啓等。不知道是什麼原因造成的。對不起浪費時間。

約翰