乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Struts2中防止表單重復(fù)提交的兩種方式

       昵稱27831725 2017-10-29

       防止表單重復(fù)提交,這是個(gè)很重要的知識點(diǎn),而且很有用。當(dāng)用戶提交了一個(gè)表單,此時(shí),地址欄顯示的是處理這個(gè)表單的Action的地址,若此時(shí)刷新,則會重新發(fā)送一次表單數(shù)據(jù),即又進(jìn)行了一次提交,若這個(gè)Action是用來處理用戶注冊的,那么重復(fù)提交會再一次向數(shù)據(jù)庫中插入之前已經(jīng)插入的數(shù)據(jù),這顯然不是我們想要的。有兩種方法,可以防止表單重復(fù)提交,一種是用Action的重定向,一種是用Session Token(Session令牌)。

      第一種方法,Action處理完用戶提交的數(shù)據(jù)后,重定向到另一個(gè)Action或是一個(gè)頁面,使用戶提交后,所停留的位置,不是當(dāng)前處理數(shù)據(jù)的Action,這樣用戶再刷新時(shí),就不會再次執(zhí)行這個(gè)Action了,就會避免表單重復(fù)提交的問題了。

      第二種方法,是一種很經(jīng)典的處理這個(gè)問題的機(jī)制。這種方法是在用戶要提交的表單中,加入一個(gè)<s:token>標(biāo)簽,這樣,當(dāng)瀏覽器第一次訪問這個(gè)帶有<s:token>標(biāo)簽的頁面時(shí),在服務(wù)器中,解析<s:token>標(biāo)簽的類(TokenTag.class),會生成一個(gè)隨機(jī)的字符串(這個(gè)字符串,查看網(wǎng)頁的源代碼可以看到),并且發(fā)送給客戶端的瀏覽器,同時(shí),在服務(wù)器中,會把這個(gè)隨機(jī)字符串保存到用戶的session對象中。當(dāng)?shù)谝淮翁峤槐韱螘r(shí),在服務(wù)器中,會比較客戶端和服務(wù)器中分別保存的這個(gè)隨機(jī)字符串,因?yàn)槭堑谝淮翁峤?,所以這兩個(gè)字符串相等,然后進(jìn)行正常的業(yè)務(wù)處理。第一次提交后,在服務(wù)器中的session中保存的這個(gè)隨機(jī)字符串,會改變?yōu)槠渌碾S機(jī)值,注意,這是很重要的一步!此時(shí),地址欄停留在處理用戶提交數(shù)據(jù)的Action中,客戶端中保存的隨機(jī)字符串沒有改變,若是刷新頁面,即重復(fù)提交,服務(wù)器再進(jìn)行兩個(gè)字符串的比較,會不相等,就會跳轉(zhuǎn)到name為invalid.token的結(jié)果頁面中,這樣就會防止表單重復(fù)提交了。

      第一種方法的舉例,在上一篇博客中,這里就不再列出了,這里主要舉例說明一下session token的機(jī)制:

      [html] view plain copy
      1. Login.jsp:  
      2.   
      3. <s:form action="/test/token" theme="simple">  
      4.         username:<s:textfield name="username"></s:textfield><br>  
      5.         password:<s:password name="password"></s:password><br>  
      6.         <s:submit value="submit"></s:submit>  
      7.         <s:token></s:token><!--一定要有這個(gè)標(biāo)簽-->  
      8.     </s:form>  
      [html] view plain copy
      1. struts.xml:  
      2.   
      3. <action name="token" class="com.suo.actions.TokenAction">  
      4.             <result name="success">/WEB-INF/result/LoginResult.jsp</result>  
      5.             <result name="invalid.token">/WEB-INF/result/TokenFailed.jsp</result>  
      6.             <!-- 若重復(fù)提交,則會跳轉(zhuǎn)到這個(gè)頁面,注意這里result的名字,一定要是invalid.token -->  
      7.               
      8.             <interceptor-ref name="token"></interceptor-ref>  
      9.             <interceptor-ref name="defaultStack"></interceptor-ref>  
      10.             <!-- 這里一定要有這兩個(gè)攔截器 -->  
      11.         </action>  
      [java] view plain copy
      1. TokenAction.java:  
      2.   
      3. package com.suo.actions;  
      4.   
      5. import java.util.Map;  
      6.   
      7. import javax.servlet.http.HttpServletRequest;  
      8. import javax.servlet.http.HttpSession;  
      9.   
      10. import org.apache.struts2.ServletActionContext;  
      11.   
      12. import com.opensymphony.xwork2.ActionContext;  
      13. import com.opensymphony.xwork2.ActionSupport;  
      14.   
      15. public class TokenAction extends ActionSupport {  
      16.     private String username;  
      17.     private String password;  
      18.       
      19.     public String getUsername() {  
      20.         return username;  
      21.     }  
      22.     public void setUsername(String username) {  
      23.         this.username = username;  
      24.     }  
      25.     public String getPassword() {  
      26.         return password;  
      27.     }  
      28.     public void setPassword(String password) {  
      29.         this.password = password;  
      30.     }  
      31.       
      32.     public String execute()  
      33.     {     
      34.         return SUCCESS;  
      35.     }  
      36. }  


      結(jié)果頁面就不寫了

      原博文地址:http://blog.csdn.net/hackerain/article/details/6990121

      PS:

      Struts2 解決表單的重復(fù)提交問題:(兩種方式:①Action的重定向②如下)
      I. 在 s:form 中添加 s:token 子標(biāo)簽
      > 生成一個(gè)隱藏域
      > 在 session 添加一個(gè)屬性值
      > 隱藏域的值和 session 的屬性值是一致的. 
      II. 使用 Token 或 TokenSession 攔截器. 
      > 這兩個(gè)攔截器均不在默認(rèn)的攔截器棧中, 所以需要手工配置一下
      > 若使用 Token 攔截器, 則需要配置一個(gè) token.valid 的 result
      > 若使用 TokenSession 攔截器, 則不需要配置任何其它的 result
      III. Token VS TokenSession
      > 都是解決表單重復(fù)提交問題的
      > 使用 token 攔截器會轉(zhuǎn)到 token.valid 這個(gè) result
      > 使用 tokenSession 攔截器則還會響應(yīng)那個(gè)目標(biāo)頁面, 但不會執(zhí)行 tokenSession 的后續(xù)攔截器. 就像什么都沒發(fā)生過一樣!
      IV. 可以使用 s:actionerror 標(biāo)簽來顯示重復(fù)提交的錯(cuò)誤消息. 
      該錯(cuò)誤消息可以在國際化資源文件中覆蓋. 該消息可以在 struts-messages.properties 文件中找到
      struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again.

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多