① struts2 如何防止表單重復提交
一、造成重復提交主要的兩個原因:
在平時的開發過程中,經常可以遇到表單重復提交的問題,如做一個注冊頁面,如果表單重復提交,那麼一個用戶就會注冊多次,重復提交主要由於兩種原因。
1、 一是,伺服器處理時間久。當用戶在表單中填完信息,點擊「提交」按鈕後,由於伺服器反應時間過長沒能及時看到響應信息,或者出於其它目的,再次點擊「提 交」按鈕,從而導致在伺服器端接收到兩條或多條相同的信息。如果信息需要存儲到後台資料庫中,如此以來就會產生資料庫操作異常提示信息,以至於給用戶帶來 錯誤信息提示,從而給用戶的使用帶來不便。
2、二是,forward跳轉引起的重復提交。在頁面跳轉的時候,有兩種類型:請求轉發和重定向,所謂請求轉發是在伺服器端進行跳轉,對用戶是透明的,此時瀏覽器中的地址不會發生改變,重定向是在客戶端發生跳轉,跳轉時候瀏覽器中的地址欄會發生改變,如果在注冊時,使用了請求轉發,那麼當刷新頁面時,就會引起表單的重復提交
二、解決方案
方案一、使用struts2中的token攔截器或者tokenSession攔截器
對token的簡單理解:
1)當用戶首次訪問包含表單的頁面時,伺服器會在這次會話中創建一個session對象,並產生一個令牌值,然後將這個令牌值作為隱藏輸入域的值,隨表單一起發送到伺服器端,同時將令牌值保存到Session中。
2) 當用戶提交頁面時,伺服器首先判斷請求參數中的令牌值和Session中保存的令牌值是否相等,若相等,則清楚Session中的令牌值,然後執行數據處 理操作。如果不相等,則提示用戶已經提交過了表單,同時產生一個新的令牌值,保存到Session中。當用戶重新訪問提交數據頁面時,將新產生的令牌值作 為隱藏輸入域的值。
####
token: 在活動Action中檢查合法令牌(token), 防止表單的重復提交;
token-session: 同上, 但是在接到非法令牌時將提交的數據保存在session中;
主要步驟如下:
第一步:在表單中加入<s:token />(當然啦!要首先導入struts2的標簽庫 <%@taglib uri="/struts-tags" prefix="s" %>)
<s:form action="helloworld_other" method="post" namespace="/test">
<s:textfield name="person.name"/><s:token/><s:submit/>
</s:form>
第二步:在struts.xml配置文件中相應的action上配置token攔截器或者tokenSession攔截器。此攔截器只能用在有form的提交請求上。
<action name="helloworld_*" class="com.jim.action.HelloWorldAction" method="{1}">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="token" />
<result name="invalid.token">/WEB-INF/page/message.jsp</result>
<result>/WEB-INF/page/result.jsp</result>
</action>
以上配置加入了「token」攔截器和「invalid.token」結果,因為「token」攔截器在會話的token與請求的token不一致時,將會直接返回「invalid.token」結果。
方案二:基於第二種重復提交表單的原因,伺服器內部使用重定向
在Struts2中的struts.xml中,result標簽的type默認值是 dispatcher,(請求轉發),要實現以上的功能,肯定不能使用默認值,需要將其值設為redirectAction(重定向到某一 Action),也就是說重一個Action跳轉到另外一個Action,此時瀏覽器中的地址是第二個Action,結合到上面的需求,可以再第一個 Action中將記錄添加到資料庫中,然後在第二個Action中將數據讀取出來。以後每次刷新,那麼只會執行第二個Action。
到struts-default.xml中找到與redirectionAction對應的一個類,ServletActionRedirectResult
從Api文檔中發現找出裡面有一個欄位叫做actionName,指定需要跳轉的Action
配置方法如下:
<action name="add" class="com.action.AddAction">
<result name="success" type="redirectAction">
<param name="actionName">show_show</param>
</result>
</action>
至於第二個Action的配置方法,相信學過struts2的同學都會。
② 請問:forward()方法怎麼使用
<jsp:forward>的作用是重定向一個html,jsp或者是一個程序段。
比如:<jsp:forward page="/servlet/login" />
<jsp:forward page="/servlet/login">
<jsp:param name="username" value="jsmith" />
</jsp:forward>
③ jsp頁面中用<jsp:forward>跳轉登陸的頁面,如果登陸成功就是跳轉到manage.jsp中,結果地址欄上的地址沒變。
forword是屬於JSP中的一種「轉發」,在伺服器端不管做了什麼事,瀏覽器是不知道的,所以地址欄的地址是不變的。如果想讓地址改變,你要用「重定向」
④ struts+hibernate提交員工,跳轉到列表頁面後刷新就會重復提交,用jsp或struts怎麼處理才能解決呀急急急
原因是:員工抄.jsp點擊提交後,瀏覽器上襲顯示的路徑就變成你提交的路徑了,所以即使到列表頁面,瀏覽器也是你在 員工.jsp頁面提交的請求路徑
解決方法:
一、用iframe,員工.jsp是iframe中的一部分,這樣瀏覽器上顯示的地址永遠是iframe的地址
二、struts提供的token,具體怎麼使用自己去網上找找token的使用
個人覺得第一種方法最簡單,省時省力,以後再也不會出現重復提交的問題了