最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談利用Session防止表單重復(fù)提交

 更新時(shí)間:2017年12月06日 10:56:32   作者:amork  
這篇文章主要介紹了淺談利用Session防止表單重復(fù)提交,簡單介紹表單重復(fù)提交的情況,分析,以及解決方法代碼示例,具有一定借鑒價(jià)值,需要的朋友可以了解下。

解決項(xiàng)目中表單重復(fù)提交的問題,在平常的項(xiàng)目中有以下幾種可能出現(xiàn)表單重復(fù)提交的情況,比如說:

1.由于服務(wù)器緩慢或者網(wǎng)絡(luò)延遲的原因,重復(fù)點(diǎn)擊提交按鈕

2.已經(jīng)提交成功,但是還不停刷新成功頁面

3.已經(jīng)提交成功,通過回退,再次點(diǎn)擊提交按鈕。

這些情況都可能使數(shù)據(jù)庫中產(chǎn)生過多相同的冗余數(shù)據(jù),浪費(fèi)數(shù)據(jù)庫資源。只有轉(zhuǎn)發(fā)才會(huì)出現(xiàn),重定向則不會(huì)。

針對第一種情況的解決方案(使用JavaScript),對后面兩種無效:

首先在頁面中添加如下格式的JavaScript代碼

 var submitFlag=false;
 function checksubmit(){
 if(!submitFlag){
  submitFlag=true;
  document.forms[0].submit(); 
  }
 }

(1)當(dāng)提交按鈕的type屬性為button時(shí):

設(shè)置按鈕的onClick=”checksubmit();”即可。

(2)當(dāng)提交按鈕的type屬性為submit時(shí):

設(shè)置按鈕的onClick=”checksubmit();”,并在<form>標(biāo)簽中增加onsubmit=”returnfalse”。因?yàn)閟ubmit按鈕的自動(dòng)提交時(shí)在點(diǎn)擊事件提交之后,將onsubmit設(shè)置為”returnfalse”,submit按鈕的自動(dòng)提交就會(huì)失效。

對于后面兩種情況,可以使用session解決,其原理是在運(yùn)行添加信息頁面時(shí)在session中放置信息,然后頁面提交信息給servlet處理,servlet獲取session中的信息,如果session中有信息不為空則將信息插入數(shù)據(jù)庫,然后刪除session中的信息,下次再提交表單時(shí)session中的信息為空,那么則不執(zhí)行存儲(chǔ)信息過程。

但是單純使用session有其局限性,所以在實(shí)際開發(fā)中,一般使用利用session結(jié)合UUID解決表單的重復(fù)提交,代碼如下:

定義一個(gè)UuidToken類

public class UuidToken {
	private static UuidToken UuidToken=new UuidToken();
	private UuidToken(){
	}
	public static UuidToken getUuidToken() {
		return UuidToken;
	}
	public synchronized String getUUIDAsStr(HttpServletRequest request){
		HttpSession session=request.getSession();
		String uuidStr=UUID.randomUUID().toString();
		if(uuidStr!=null){
			session.setAttribute("session.uuid", uuidStr);
		}
		return uuidStr;
	}
	/**
 * 判斷session中保存的uuid和jsp頁面上的uuid是否相等 
 */
	public synchronized Boolean isUUIDValidate(HttpServletRequest request) {
		//獲取已存在的session 
		HttpSession session=request.getSession(false);
		if(session==null){
			return false;
		}
		String sessionuuid = (String)session.getAttribute ("session.uuid");
		if(sessionuuid==null){
			return false;
		}
		String htmluuid=request.getParameter("html.uuid");
		if(htmluuid==null){
			return false;
		}
		return sessionuuid.equals(htmluuid);
	}
	/**
 * 刪除uuid 
 */
	public synchronized void resetUUID(HttpServletRequest request) {
		HttpSession session=request.getSession(false);
		if(session==null){
			return;
		}
		session.removeAttribute("session.uuid");
	}
}

在jsp頁面增加一個(gè)隱藏域,利用uuid生成一個(gè)唯一的標(biāo)識(shí)號,賦給隱藏域,把唯一的標(biāo)識(shí)號 放置到session中一份,代碼如下:

<input type="hidden" name="html.uuid" value='<%=UuidToken.getUuidToken().getUUIDAsStr(request)%>'>    

提交給servlet后,獲取 jsp頁隱藏域的值,用隱藏域的值和session中放置的值做比對,如果相同,保存數(shù)據(jù)并從session中刪除UUID,不相同則說明是重復(fù)提交,不進(jìn)行處理。

Boolean flag= UuidToken.getUuidToken().isUUIDValidate(request);
if(flag){
	// 保存信息到數(shù)據(jù)庫
	//從session刪除uuid的
	UuidToken.getUuidToken().resetUUID(request);
} else{
	System.out.println("表單重復(fù)提交");
}

總結(jié)

以上就是本文關(guān)于淺談利用Session防止表單重復(fù)提交的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • SpringCloud搭建Eureka服務(wù)模塊的過程

    SpringCloud搭建Eureka服務(wù)模塊的過程

    Eureka在分布式系統(tǒng)中起到了連接各個(gè)微服務(wù)的紐帶作用,使得服務(wù)之間的交互變得更加靈活、可靠,本文將深入探討如何使用Spring?Cloud,逐步引導(dǎo)讀者完成Eureka服務(wù)模塊的搭建,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • Mybatis開發(fā)要點(diǎn)-resultType和resultMap有什么區(qū)別詳解

    Mybatis開發(fā)要點(diǎn)-resultType和resultMap有什么區(qū)別詳解

    本文主要介紹了Mybatis開發(fā)要點(diǎn)-resultType和resultMap有什么區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringBoot中自定義參數(shù)綁定步驟詳解

    SpringBoot中自定義參數(shù)綁定步驟詳解

    這篇文章主要介紹了SpringBoot中自定義參數(shù)綁定步驟詳解,非常不錯(cuò),具有參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-02-02
  • 如何使用Spring+redis實(shí)現(xiàn)對session的分布式管理

    如何使用Spring+redis實(shí)現(xiàn)對session的分布式管理

    本篇文章主要介紹了如何使用Spring+redis實(shí)現(xiàn)對session的分布式管理,本文主要是在Spring中實(shí)現(xiàn)分布式session,采用redis對session進(jìn)行持久化管理,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Java8通過CompletableFuture實(shí)現(xiàn)異步回調(diào)

    Java8通過CompletableFuture實(shí)現(xiàn)異步回調(diào)

    這篇文章主要介紹了Java8通過CompletableFuture實(shí)現(xiàn)異步回調(diào),CompletableFuture是Java?8?中新增的一個(gè)類,它是對Future接口的擴(kuò)展,下文關(guān)于其更多相關(guān)詳細(xì)介紹需要的小伙伴可以參考一下
    2022-04-04
  • Springboot actuator應(yīng)用后臺(tái)監(jiān)控實(shí)現(xiàn)

    Springboot actuator應(yīng)用后臺(tái)監(jiān)控實(shí)現(xiàn)

    這篇文章主要介紹了Springboot actuator應(yīng)用后臺(tái)監(jiān)控實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java調(diào)用webservice的.asmx接口的使用步驟

    java調(diào)用webservice的.asmx接口的使用步驟

    這篇文章主要介紹了java調(diào)用webservice的.asmx接口的使用步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • mybatis-plus團(tuán)隊(duì)新作mybatis-mate實(shí)現(xiàn)數(shù)據(jù)權(quán)限

    mybatis-plus團(tuán)隊(duì)新作mybatis-mate實(shí)現(xiàn)數(shù)據(jù)權(quán)限

    本文主要介紹了mybatis-plus 團(tuán)隊(duì)新作 mybatis-mate 輕松搞定數(shù)據(jù)權(quán)限,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java的LinkedHashMap的實(shí)現(xiàn)原理詳解

    Java的LinkedHashMap的實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Java的LinkedHashMap的實(shí)現(xiàn)原理詳解,???LinkedHashMap是Map接口的哈希表和鏈接列表實(shí)現(xiàn),具有可預(yù)知的迭代順序,此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵,此類不保證映射的順序,特別是它不保證該順序恒久不變,需要的朋友可以參考下
    2023-09-09
  • Spring WebFlux之響應(yīng)式編程詳解

    Spring WebFlux之響應(yīng)式編程詳解

    這篇文章主要介紹了Spring WebFlux之響應(yīng)式編程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

沅江市| 荥经县| 沂源县| 徐水县| 万载县| 福海县| 正蓝旗| 潼南县| 宁城县| 松原市| 佳木斯市| 云安县| 临潭县| 安徽省| 青州市| 舟山市| 黄石市| 沐川县| 蛟河市| 德格县| 治县。| 兰州市| 安阳市| 齐河县| 睢宁县| 扶风县| 合川市| 吉木萨尔县| 永登县| 满洲里市| 东方市| 应城市| 乌兰察布市| 保靖县| 泌阳县| 泉州市| 洛阳市| 板桥市| 天台县| 巴林右旗| 通化县|