編程語言 php java

Struts 防止重復提交方法

java HTML我幫您 1年前  0次瀏覽
用戶重復提交同一個HTML表單的原因不在乎兩種:一是操作失誤;二是某個表單的處理時間過長而使得用戶不知該如何是好。在某些場合,重復提交同一個HTML表單的后果可能非常嚴重;在另外一些場合,這種情況也許只會令人敢不快而已。例如,在使用使用卡進行在線支付到時候,如果服務器的響應速度太慢,用戶難免會再次點擊提交按鈕,而這就有可能導致那張信用卡上的金額被劃走兩次。我們再來看一個后果沒那么嚴重的例子 -- 用來錄入產品信息的表單,重復提交這些表單可能同一中產品被添加二次。

在防止重復提交同一個表單方面,不同的瀏覽器有這不同的行為。Mozilla Firefox瀏覽器對重復點擊同一按鈕將不予理睬,這為我們提供了某種形式的保護。其他品牌的瀏覽器,包括IE在內,目前還沒有實現能夠防止重復提交的功能。此外,Mozilla和非Mozilla瀏覽器都算上,如果在請求被處理之后按下了瀏覽器本身的Refresh/Reload(刷新)按鈕。同樣的請求就會被再次提交,而這顯然是一種重復提交行為。因為,質押重復提交有可能給你的業務邏輯帶來不良影響,你就必須采取必要的預防措施。

Struts已經內置了能夠防止用戶重復提交同一個HTML表單的功能。它采用的辦法在其他一些用來開發Web應用程序的技術里也可以見到:讓服務器生成一個唯一標記,并在服務器和表單里保存一份這個標記的副本。此后,在用戶提交表單的時候,表單里的標記將雖說這其他請求參數一起發送到服務器,服務器將對它收到的標記和它留存的標記進行比較。如果兩者匹配,這次從提交來的表單就是被認為是有效的,服務器將對之做出必要的處理并重新設置一個標記。隨后(因為不小心)提交相同的表單就會失敗,因為服務器上的標記已經重置。
下面看在JAVA的 struts2 是如何實現 防止重復提交問題 的:

1、使用Struts2的表單標簽,其中需要增加token標簽。如下:


...
<%@ taglib uri="/struts-tags" prefix="s" %>
注意:要確保jsp中能使用struts2標簽,在web.xml中定義的過濾類型為任意,即/*
...

...





2、在struts配置文件中增加token攔截器。(token 和 token-session 攔截器的啟用,是在 struts.xml 配置文件中,既可以為包啟用,也可以單獨為某個 action 啟用)

2.1 在 Action 中啟用 token ,該攔截器僅為本 action 使用,



"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">





/success.jsp
/inputPage.jsp





2.2 在包中啟用 token , 該攔截器可為該包內所有的 action 元素使用;
注意,需要name為invaid.token的result。這是當攔截器判斷是重復提交的時候,會轉向的視圖頁面。











/success.jsp
/inputPage.jsp




3、invaid.token頁面打印錯誤信息,一樣可以使用struts標簽。如下:





注意: 如果在session失效時間外再提交頁面,同樣出現不相等的情況,因而轉到 invaid.token 指定的視圖頁面中去;

總結:
1、JSP使用< s:token/ >標簽的時候,Struts2會建立一個UUID(全局唯一的字符串)放在session中,并且會成為一個hidden放在form中。


2、token攔截器會判斷客戶端form提交的token值和session中保存的值是否equals。如果equals則執行Action。否則攔截器直接返回invaid.token結果轉向對應的視圖,Action對應的方法也不會執行;


3、當指定了別的攔截器時,如本例的token,僅僅完成某項功能,后面同時需要指定默認的攔截器,因struts2需要用到,需要注意的是,當沒有指定任何攔截器時,默認是隱式啟用默認的攔截器的;

發表評論

腾讯彩票兑奖