国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

詳談表單重復(fù)提交的三種情況及解決方法

2019-11-19 15:47:06
字體:
供稿:網(wǎng)友

第一種情況:提交完表單以后,不做其他操作,直接刷新頁面,表單會提交多次。

- 在servlet中寫一句輸出,用來判斷是否提交多次

System.out.println("已經(jīng)插入");request.getRequestDispatcher("/login_success.jsp").forward(request, response);

- 這樣的話,刷新多少次,就會在控制器顯示多少個“已經(jīng)插入”。

- 根本原因:Servlet處理完請求以后,直接轉(zhuǎn)發(fā)到目標頁面,這樣整個業(yè)務(wù)只發(fā)送了一次請求,那么當你在瀏覽器中點擊刷新會一直都會刷新之前的請求。

- 解決方法:不用轉(zhuǎn)發(fā)到另一頁面,采用重定向的方式跳轉(zhuǎn)到目標頁面

response.sendRedirect("/day0815-session/login_success.jsp");

第二種情況:在提交表單時,如果網(wǎng)速較差,可能會導致點擊提交按鈕多次,這種情況也會導致表單重復(fù)提交。

- 解決方法:點擊提交按鈕之后,使按鈕不可用。通過js完成

<script type="text/javascript"> window.onload = function(){   //獲取按鈕的對象  var btn = document.getElementById("btn");  //為按鈕綁定單擊響應(yīng)函數(shù)  btn.onclick = function(){     //點擊以后使按鈕不可用   this.disabled=true;    //當將提交按鈕設(shè)置為不可用時,會自動取消它的默認行為   //手動提交表單   this.parentNode.submit();   }; };</script><br><br><form action="${pageContext.request.contextPath }/SessionServlet" ><br>user:<input type="text" name="username"><br>password<input type="password" name="pwd"><br><input type="submit" value="提交" id="btn"> <br></form>

- 注意“提交”按鈕,此時已經(jīng)不可按!

第三種情況:表單提交成功以后,直接點擊瀏覽器上回退按鈕,不刷新頁面,然后點擊提交按鈕再次提交表單。

- 根本原因:因為服務(wù)器在處理請求時,不會檢查是否為重復(fù)提交的請求。

- 解決方案:

使用一個token的機制

- token就是令牌的意思

- 服務(wù)器在處理請求之前先來檢查瀏覽器的token

- token由服務(wù)器來創(chuàng)建,并交給瀏覽器,瀏覽器在向服務(wù)器發(fā)送請求時需要帶著這個token

- 服務(wù)器處理請求前檢查token是否正確,如果正確,則正常處理,否則返回一個錯誤頁面

- 服務(wù)器所創(chuàng)建的token只能使用一次

- token一般使用一個唯一的標識

- 在jsp頁面,獲取uuid作為token

- UUID:32位字符串,通常作為對象或者表的唯一標識,根據(jù)機器碼和時間戳(從1970年1月1日開始到現(xiàn)在)生成。

<% String uuid = UUID.randomUUID().toString(); session.setAttribute("uuid", uuid);%><br>${errormsg }<br><form action="${pageContext.request.contextPath }/SessionServlet" ><br>  <input type="text" name="uuid" value="<%=uuid %>"/><br>  user:<input type="text" name="username"><br>  password<input type="password" name="pwd"><br>  <input type="submit" value="提交" "><br></form>

- 在servlet頁面

String reqUUID = request.getParameter("uuid");HttpSession session = request.getSession();String sessUUID = (String) session.getAttribute("uuid");session.removeAttribute("uuid");  if(reqUUID.equals(sessUUID)){ response.sendRedirect(request.getContextPath()+"/login_success.jsp"); System.out.println("已經(jīng)插入");}else{ request.setAttribute("errormsg", "重復(fù)登陸"); request.getRequestDispatcher("/3.jsp").forward(request, response);}

- 表單重復(fù)提交的危害:

- 向數(shù)據(jù)庫中插入大量的重復(fù)且沒有意義的數(shù)據(jù),占用服務(wù)器的資源

- 處理請求服務(wù)器并沒有檢查請求是否為重復(fù)的請求,導致惡意的攻擊

以上這篇詳談表單重復(fù)提交的三種情況及解決方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 哈密市| 武胜县| 秦皇岛市| 锦州市| 安阳市| 行唐县| 西林县| 土默特右旗| 盘山县| 永宁县| 庆元县| 融水| 安阳市| 阳泉市| 长宁区| 如东县| 康平县| 桐城市| 内乡县| 潜江市| 朔州市| 柞水县| 南昌县| 新河县| 龙陵县| 连江县| 赫章县| 江阴市| 鹰潭市| 闽侯县| 海口市| 扎囊县| 会理县| 米脂县| 云安县| 江孜县| 东城区| 普安县| 高陵县| 肇州县| 武陟县|