java 學(xué)習(xí)

          軟件開發(fā)相關(guān)方面的學(xué)習(xí)

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            33 Posts :: 1 Stories :: 5 Comments :: 0 Trackbacks

          利用Token解決重復(fù)重復(fù)提交:
          Struts利用同步令牌(Token)的方式來解決Web應(yīng)用中重復(fù)提交的問題,其機(jī)制是在form表單中增加一個隱藏的域,保存當(dāng)前令牌值,然后在程序中判斷此令牌值是否合法.
          org.apache.struts.action.Action類提供了相關(guān)操作Token的方法:
          1、isTokenValie方法:
          判斷存儲在當(dāng)前用戶會話中的令牌值和請求參數(shù)中的令牌值是否匹配.如果匹配,返回true,反之返回false.只要符合下列情況之一的,就會返回false:
          不存在HttpSession對象;
          在session范圍內(nèi)沒有保存令牌值;
          在請求參數(shù)中沒有令牌值;
          存儲在當(dāng)前用戶session范圍內(nèi)的令牌值和請求參數(shù)中的令牌值不匹配.
          2、resetToken方法:
          從當(dāng)前session范圍內(nèi)刪除令牌屬性.
          3、saveToken方法:
          創(chuàng)建一個新的令牌,并把它保存在當(dāng)前session范圍內(nèi).如果HttpSession不存在,就首先創(chuàng)建一個HttpSession對象.

          如何利用上述方法應(yīng)用令牌機(jī)制解決重復(fù)提交問題:
          以用戶注冊為例:
          在用戶請求newUser.jsp之前,首先把請求轉(zhuǎn)發(fā)到PrepareAction,PrepareAction 調(diào)用saveToken方法,創(chuàng)建一個新的令牌,并將令牌值保存在當(dāng)前HttpSession中(新創(chuàng)建的),PrepareAction接著把請求轉(zhuǎn)發(fā)給newUser.jsp.

          newUser.jsp中的<html:form>標(biāo)簽自動判斷在session范圍內(nèi)是否存在Token,如果存在,就自動在表單中生成一個包含Token信息的隱藏字段,例如:
          <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="....">

          在用戶提交表單后,由InsertUserAction處理請求.在InsertUserAction中,調(diào)用isTokenValid方法,判斷當(dāng)前用戶會話中的令牌值和請求參數(shù)中的令牌值是否匹配.如果匹配,就調(diào)用resetToken方法,刪除Token,然后執(zhí)行插入數(shù)據(jù)操作.如果不匹配,返回相關(guān)錯誤提示,進(jìn)行相關(guān)操作.

          OK.醬紫就可以有效放置重復(fù)提交了.

          如何在不使用Struts的前提下利用令牌機(jī)制解決重復(fù)提交問題:
          Struts的令牌機(jī)制有幾個要點(diǎn)可以讓我們在普通的JSP/Servlet中解決重復(fù)提交問題.
          1、提供幾個操作Token的相關(guān)方法:
          關(guān)鍵有三個:
          resetToken(HttpServletRequest request)-->重置令牌值.
          saveToken(HttpServletRequest request)-->保存令牌值.
          isTokenValid(HttpServletRequest request)-->檢測令牌是否合法.

          2、在form表單中增加隱藏域,保存當(dāng)前令牌值.

          3、在執(zhí)行持久性數(shù)據(jù)操作之前調(diào)用相關(guān)方法判斷當(dāng)前令牌是否合法,之后在進(jìn)行相關(guān)操作.

          方法是相同的,只是實(shí)現(xiàn)的方式不太一樣.

          truts1.1 API關(guān)于幾個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 2006-04-12 17:05 zxf 閱讀(452) 評論(0)  編輯  收藏 所屬分類: struts
          主站蜘蛛池模板: 临邑县| 九龙县| 湄潭县| 贵南县| 厦门市| 八宿县| 兴隆县| 肥城市| 华池县| 崇信县| 射阳县| 太仓市| 镇远县| 岳池县| 枝江市| 通江县| 长垣县| 上杭县| 郎溪县| 邢台市| 萨嘎县| 自治县| 平果县| 宜春市| 长汀县| 独山县| 江北区| 方正县| 蕉岭县| 肃南| 临澧县| 板桥市| 新巴尔虎左旗| 临安市| 江永县| 西城区| 滦南县| 长汀县| 奉新县| 临沂市| 高唐县|