本文目錄一覽:
- 1、在java中如何處理重複提交的請求
- 2、在java jsp中怎麼處理用戶多次點擊提交按鈕造成數據重複
- 3、javaweb防止表單重複提交的幾種解決方案
- 4、java後台介面 怎麼防止重複提交
- 5、java如何實現你提交太頻繁了
- 6、vuejava防止重複創建訂單
在java中如何處理重複提交的請求
用token解決,你可以直接在百度中搜索「java中處理重複提交」。還有就是可以用一個布爾型的標記,提交後就把值變下,在提交的前都去判斷這個值。
在java jsp中怎麼處理用戶多次點擊提交按鈕造成數據重複
java jsp處理用戶多次點擊提交按鈕造成數據重複,最常見的方法是點擊按鈕提交之後,讓線程休眠幾秒再執行,如下代碼:
1.提交的表單頁面
%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8″%
!DOCTYPE HTML
html
head
titleForm表單/title
/head
body
form action=”${pageContext.request.contextPath}/servlet/DoFormServlet” method=”post”
用戶名:input type=”text” name=”username”
input type=”submit” value=”提交” id=”submit”
/form
/body
/html
2.處理提交表單的servlet,裡面有提供防止重複提交的代碼,如下:
package xdp.gacl.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DoFormServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//客戶端是以UTF-8編碼傳輸數據到伺服器端的,所以需要設置伺服器端以UTF-8的編碼進行接收,否則對於中文數據就會產生亂碼
request.setCharacterEncoding(“UTF-8”);
String userName = request.getParameter(“username”);
try {
//讓當前的線程睡眠3秒鐘,模擬網路延遲而導致表單重複提交的現象
Thread.sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“向資料庫中插入數據:”+userName);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
javaweb防止表單重複提交的幾種解決方案
1.js方法解決:關於js方法解決就是說通過js動態控制提交按鈕不能多次點擊,或者多次點擊不起作用。
方案一:通過設立標識使表單不能重複提交:
var flag=true; function Sub(){ if(flag){
flag = false;
document.form1.onsubmit();
}
}
方案二:一次點擊後使得提交按鈕變成不可用
input type=”button” value=”login” onclick=”this.disabled=true;this.form.submit();” /
總的來說,js解決方案是基本可以防止重複點擊提交按鈕造成的重複提交問題,但是前進後退操作,或者F5刷新頁面等問題並不能得到解決。
最重要的一點,前端的代碼只能防止不懂js的用戶,如果碰到懂得js的編程人員,那js方法就沒用了。
2.設置HTTP報頭,控制表單緩存,使得所控制的表單不緩存信息,這樣用戶就無法通過重複點擊按鈕去重複提交表單。
meta http-equiv=”Cache-Control” content=”no-cache, must-revalidate”
但是這樣做也有局限性,用戶在提交頁面點擊刷新也會造成表單的重複提交。
3.通過PRG設計模式(用來防止F5刷新重複提交表單):
PRG模式通過響應頁面Header返回HTTP狀態碼進行頁面跳轉替代響應頁面跳轉過程。具體過程如下:
客戶端用POST方法請求伺服器端數據變更,伺服器對客戶端發來的請求進行處理重定向到另一個結果頁面上,客戶端所有對頁面的顯示請求都用get方法告知伺服器端,這樣做,後退再前進或刷新的行為都發出的是get請求,不會對server產生任何數據更改的影響。
但此方法也不能防止所有情況:例如用戶多次點擊提交按鈕;惡意用戶避開客戶端預防多次提交手段,進行重複提交請求;
以上都說的是在客戶端如何防止表單重複提交,下面說一下伺服器端有哪些可行的方法。
4.如果是註冊或存入資料庫的操作,可以通過在資料庫中欄位設立唯一標識來解決,這樣在進行資料庫插入操作時,因為每次插入的數據都相同,資料庫會拒絕寫入。這樣也避免了向資料庫中寫入垃圾數據的情況,同時也解決了表單重複提交問題。
但是這種方法在業務邏輯上感覺是說不過去的,本來該有的邏輯,缺因為資料庫該有的設計隱藏了。而且這種方法也有一定的功能局限性,只適用於某系特定的插入操作。
5.session方法:
在struts框架中防止表單重複提交的方法是生成Token存入session,以此判斷表單是否是第一次提交。以下給大家解釋一下運行流程。
首先客戶端請求伺服器中的表單,伺服器將客戶機所請求的表單發給客戶機同時發送一個特殊的隨機數(Token)作為表單號存在表單的隱藏域中(type=hidden),並且存入伺服器端的session中。
在客戶端填寫完表單內容向伺服器提交時,同時也將隱藏域中的表單號發給伺服器端,伺服器端此時會檢測伺服器端的表單號是否存在,如果存在,則進行提交操作,並刪除此表單號,否則,伺服器視為客戶機端重複提交表單,不予操作。
此處貼出生成Token的代碼(保證隨機數的獨一無二性):
class Token{ private Token(){} private static Token instance = new Token();
public Token getinstance(){ return instance;
}
//隨機數發生器
public String getToken(){
String token = System.currentTimeMillis() + “” + new Random().nextInt();//獲得毫秒數加隨機數
try {
MessageDigest md = MessageDigest.getInstance(“md5”); byte[] md5 = md.digest(token.getBytes());
BASE64Encoder base = new BASE64Encoder();
base.encode(md5);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}
要強調的是,利用session方法解決表單重複問題是十分完美的,基本上可以應對各種重複提交問題。
但!是不是之前在客戶端防止表單重複提交的種種方法就不使用了呢?
答案是否定的,我們需要多種方法混合使用才能達到最好的效果,也許有人會問,不是說session方法基本可以應對各種重複提交問題了嗎?
這裡我們所說的達到最好效果指的是,給用戶更好地體驗,例如用戶點擊了提交按鈕,這時將按鈕變為不可用的,用以告訴用戶你已經提交內容了,不可重複提交。還有如果無論什麼情況都用session防止表單重複提交問題,反而無形的增加了伺服器端的負擔。
java後台介面 怎麼防止重複提交
防止重複提交的方法很多,例如:
1、Meta法
在你的表單頁里HEAD區加入這段代碼:
META HTTP-EQUIV=”pragma” CONTENT=”no-cache”
META HTTP-EQUIV=”Cache-Control” CONTENT=”no-cache, must-revalidate”
META HTTP-EQUIV=”expires” CONTENT=”Wed, 26 Feb 1997 08:21:57 GMT”
2、令牌法
生成一個令牌保存在用戶session中,在form中加一個hidden域,顯示該令牌的值,form提交後重新生成一個新的令牌,將用戶提交的令牌和session中的令牌比較,如不同則為重複提交。
3、禁用按鈕法
input type=”button” value=”提交” onclick=”this.disabled=true;this.form.submit()”
4、struts配置法
修改struts-config.xml文件,在action裡面有一個redirect重新定向的屬性,struts中默認的是false,添加這個屬性,改成true,在forword中寫上要跳轉頁面的絕對或者相對地址就行了
修改如下:
action-mappings
action attribute=”newsActionForm” name=”newsActionForm” input=”/addnews.jsp” path=”/newsAction” parameter=”method” scope=”request” type=”com.yongtree.news.action.NewsAction”
forward name=”list” path=”/listnews.jsp” redirect=”true”/forward
forward name=”error” path=”/addnews.jsp”/forward
/action
/action-mappings
java如何實現你提交太頻繁了
可以使用前、後端分別攔截的方式。
前端攔截是指通過 HTML 頁面來攔截重複請求,比如在用戶點擊完「提交」按鈕後,我們可以把按鈕設置為不可用或者隱藏狀態。但前端攔截有一個致命的問題,如果是懂行的程序員或非法用戶可以直接繞過前端頁面,通過模擬請求來重複提交請求,比如充值了100元,重複提交了10次變成了1000元。所以除了前端攔截一部分正常的誤操作之外,後端的攔截也是必不可少。後端攔截的實現思路是在方法執行之前,先判斷此業務是否已經執行過,如果執行過則不再執行,否則就正常執行,將請求的業務 ID 存儲在內存中,並且通過添加互斥鎖來保證多線程下的程序執行安全。
vuejava防止重複創建訂單
vuejava防止重複創建訂單的步驟:
1、創建訂單時,用訂單信息計算一個哈希值。
2、判斷redis中是否有key,有則不允許重複提交。
3、沒有則生成一個新key,放到redis中設置個過期時間即可。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/188466.html