本文為本人在dev2dev回答網友提問所作:
原始鏈接: http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=22185&tstart=0
利用Token解決重復重復提交:
Struts利用同步令牌(Token)的方式來解決Web應用中重復提交的問題,其機制是在form表單中增加一個隱藏的域,保存當前令牌值,然后在程序中判斷此令牌值是否合法.
org.apache.struts.action.Action類提供了相關操作Token的方法:
1、isTokenValie方法:
判斷存儲在當前用戶會話中的令牌值和請求參數中的令牌值是否匹配.如果匹配,返回true,反之返回false.只要符合下列情況之一的,就會返回false:
不存在HttpSession對象;
在session范圍內沒有保存令牌值;
在請求參數中沒有令牌值;
存儲在當前用戶session范圍內的令牌值和請求參數中的令牌值不匹配.
2、resetToken方法:
從當前session范圍內刪除令牌屬性.
3、saveToken方法:
創建一個新的令牌,并把它保存在當前session范圍內.如果HttpSession不存在,就首先創建一個HttpSession對象.
如何利用上述方法應用令牌機制解決重復提交問題:
以用戶注冊為例:
在用戶請求newUser.jsp之前,首先把請求轉發到PrepareAction,PrepareAction 調用saveToken方法,創建一個新的令牌,并將令牌值保存在當前HttpSession中(新創建的),PrepareAction接著把請求轉發給newUser.jsp.
newUser.jsp中的<html:form>標簽自動判斷在session范圍內是否存在Token,如果存在,就自動在表單中生成一個包含Token信息的隱藏字段,例如:
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="....">
在用戶提交表單后,由InsertUserAction處理請求.在InsertUserAction中,調用isTokenValid方法,判斷當前用戶會話中的令牌值和請求參數中的令牌值是否匹配.如果匹配,就調用resetToken方法,刪除Token,然后執行插入數據操作.如果不匹配,返回相關錯誤提示,進行相關操作.
OK.醬紫就可以有效放置重復提交了.
如何在不使用Struts的前提下利用令牌機制解決重復提交問題:
Struts的令牌機制有幾個要點可以讓我們在普通的JSP/Servlet中解決重復提交問題.
1、提供幾個操作Token的相關方法:
關鍵有三個:
resetToken(HttpServletRequest request)-->重置令牌值.
saveToken(HttpServletRequest request)-->保存令牌值.
isTokenValid(HttpServletRequest request)-->檢測令牌是否合法.
2、在form表單中增加隱藏域,保存當前令牌值.
3、在執行持久性數據操作之前調用相關方法判斷當前令牌是否合法,之后在進行相關操作.
方法是相同的,只是實現的方式不太一樣.
truts1.1 API關于幾個Token操作方法的說明:
protected boolean isTokenValid(javax.servlet.http.HttpServletRequest request)
Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it.
protected boolean isTokenValid(javax.servlet.http.HttpServletRequest request, boolean reset)
Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it.
protected void resetToken(javax.servlet.http.HttpServletRequest request)
Reset the saved transaction token in the user's session.
protected void saveToken(javax.servlet.http.HttpServletRequest request)
Save a new transaction token in the user's current session, creating a new session if necessary.
posted on 2005-04-18 10:08
eamoi 閱讀(7008)
評論(7) 編輯 收藏 所屬分類:
Java