java重複提交,java後端解決重複提交問題

本文目錄一覽:

在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-hk/n/188466.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 13:31
下一篇 2024-11-28 13:31

相關推薦

  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智能等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示「文件中含有宏,保存將導致宏不可用」的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論