1. 程式人生 > >springmvc 攔截器 防止重複提交表單

springmvc 攔截器 防止重複提交表單

第一種方法:判斷session中儲存的token

比較麻煩,每次在提交表單時都必須傳入上次的token。而且當一個頁面使用ajax時,多個表單提交就會有問題。

註解Token程式碼:

  1. package com.thinkgem.jeesite.common.repeat_form_validator;  
  2. import java.lang.annotation.ElementType;  
  3. import java.lang.annotation.Retention;  
  4. import java.lang.annotation.RetentionPolicy;  
  5. import java.lang.annotation.Target;  
  6. /** 
  7.  * 頁面form   token 
  8.  * @author Administrator 
  9.  * 
  10.  */
  11. @Target(ElementType.METHOD)  
  12. @Retention(RetentionPolicy.RUNTIME)  
  13. public@interface FormToken {  
  14.     boolean save() defaultfalse;  
  15.     boolean remove() defaultfalse;  
  16. }  


攔截器TokenInterceptor程式碼:

  1. package com.thinkgem.jeesite.common.repeat_form_validator;  
  2. import java.lang.reflect.Method;  
  3. import java.util.UUID;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletResponse;  
  6. import org.springframework.web.method.HandlerMethod;  
  7. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  8. publicclass FormTokenInterceptor extends HandlerInterceptorAdapter {  
  9.     @Override
  10.     publicboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
  11.         if (handler instanceof HandlerMethod) {  
  12.             HandlerMethod handlerMethod = (HandlerMethod) handler;  
  13.             Method method = handlerMethod.getMethod();  
  14.             FormToken annotation = method.getAnnotation(FormToken.class);  
  15.             if (annotation != null) {  
  16.                 boolean needSaveSession = annotation.save();  
  17.                 if (needSaveSession) {  
  18.                     request.getSession(false).setAttribute("formToken", UUID.randomUUID().toString());  
  19.                 }  
  20.                 boolean needRemoveSession = annotation.remove();  
  21.                 if (needRemoveSession) {  
  22.                     if (isRepeatSubmit(request)) {  
  23.                         returnfalse;  
  24.                     }  
  25.                     request.getSession(false).removeAttribute("formToken");  
  26.                 }  
  27.             }  
  28.             returntrue;  
  29.         } else {  
  30.             returnsuper.preHandle(request, response, handler);  
  31.         }  
  32.     }  
  33.     privateboolean isRepeatSubmit(HttpServletRequest request) {  
  34.         String serverToken = (String) request.getSession(false).getAttribute("formToken");  
  35.         if (serverToken == null) {  
  36.             returntrue;  
  37.         }  
  38.         String clinetToken = request.getParameter("formToken");  
  39.         if (clinetToken == null) {  
  40.             returntrue;  
  41.         }  
  42.         if (!serverToken.equals(clinetToken)) {  
  43.             returntrue;  
  44.         }  
  45.         returnfalse;  
  46.     }  
  47. }  

然後在Spring MVC的配置檔案里加入:

  1. <mvc:interceptors>  
  2.     <mvc:interceptor>  
  3.             <mvc:mapping path="/**"/>  
  4.             <bean class="com.thinkgem.jeesite.common.repeat_form_validator.FormTokenInterceptor"/>  
  5.         </mvc:interceptor>  
  6.     </mvc:interceptors>  


相關程式碼已經註釋,相信你能看懂。
關於這個方法的用法是:
在需要生成token的controller上增加@FormToken(save=true),而在需要檢查重複提交的controller上新增@FormToken(remove=true)就可以了。
另外,你需要在view裡在form裡增加下面程式碼:

  1. <inputtypeinputtype="hidden"name="formToken"value="${formToken}"/>

已經完成了,去試試看你的資料還能重複提交了吧。

注意在ajax提交時 要加上 formToken引數

第二種方法(判斷請求url和資料是否和上一次相同)

推薦,非常簡單,頁面不需要任何傳入,只需要在驗證的controller方法上寫上自定義註解即可

寫好自定義註解

  1. package com.thinkgem.jeesite.common.repeat_form_validator;  
  2. import java.lang.annotation.ElementType;  
  3. import java.lang.annotation.Retention;  
  4. import java.lang.annotation.RetentionPolicy;  
  5. import java.lang.annotation.Target;  
  6. /** 
  7.  * 一個使用者 相同url 同時提交 相同資料 驗證 
  8.  * @author Administrator 
  9.  * 
  10.  */
  11. @Target(ElementType.METHOD)  
  12. @Retention(RetentionPolicy.RUNTIME)  
  13. public@interface SameUrlData {  
  14. }  

記一次 thinkphp5令牌驗證防止重複提交

因為專案需要表單提交,可是發現了必須要防止使用者提交,經過了幾個小時的百度旅遊總算找到的方法,其實說到底還是看官方手冊來的頭緒,以後看來要多看。。。。。。。 其實好像就是驗證器中加入token的驗證而已,擼程式碼吧 首先在html的from中加入下列程式碼,其實官方手冊有說明的 {:token()

spring mvc 防止重複提交的兩種方法,推薦第二種

第一種方法:判斷session中儲存的token 比較麻煩,每次在提交表單時都必須傳入上次的token。而且當一個頁面使用ajax時,多個表單提交就會有問題。 註解Token程式碼: package com.thinkgem.jeesite.common.re

分享防止重複提交【php】

表單重複提交是在多使用者Web應用中最常見、帶來很多麻煩的一個問題。有很多的應用場景都會遇到重複提交問題,比如: 點選提交按鈕兩次。點選重新整理按鈕。使用瀏覽器後退按鈕重複之前的操作,導致重複提交表單。使用瀏覽器歷史記錄重複提交表單。瀏覽器重複的HTTP請求。   幾種防止

前端頁面js防止重複提交

1.第一個方法是我自己想的,就是設定submit按鈕屬性為disabled,然後當後臺請求成功移除這個屬性。 2.第二個是一個面試官告訴我的,我個人覺得和我第一個異曲同工,就是在點選的時候加一個class屬性,然後js判定是否有這個class,如果有的話不再重複提交, 後臺

THINKPHP 防止重複提交 自己實現token

首先在專案function.php 定義幾個方法。 //建立TOKEN function creatToken() { $code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_ran

客戶端服務端防止使用者重複提交

一、什麼是表單重複提交? 當網路有延遲時,使用者提交的表單等資料還沒有完成此次提交,但使用者又多次點選提交,造成使用者資料在資料庫或儲存中被提交多次。 利用執行緒延遲,簡單模擬重複提交。 表單頁面為form.html [html] view plain

Struts2中重複提交分析

原因:Struts2提交表單完成新增資料等操作後,再去重新整理頁面會彈出警告,提示資訊會再次被提交(同樣的表單資料) 解決:在action中配置攔截器 1.需要在提交資料的表單<form> 內增加<s:token></s:token> 在js

避免重新整理頁面時重複提交資料

<?php // session_start() 會建立新會話或者重用現有會話。 如果通過 GET 或者 POST 方式,或者使用 cookie 提交了會話 ID, 則會重用現有會話。 session_start(); if( ! empty($_POST['sub']) ) {

自定義註解攔截,防止重複提交

1.自定義註解 package com.paotui.util; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import ja

JFinal的攔截防止重複提交

       前段時間師傅讓我整理一份防止表單重複提交的方案,平常所用的提交按鈕後通過js禁止提交等方式也可以的,若是禁用js可能就尷尬了,不過也沒幾個人會這麼幹。起初也是在網上百度各種資料照貓畫虎搞一套的,畢竟目前水平低低的我確實需要多學習,先不說創造,乖乖吸取前輩們的經驗

Http協議與防止重複提交實戰解決方案

http長連線與短連線 HTTP協議與TCP/IP協議的關係 HTTP的長連線和短連線本質上是TCP長連線和短連線。HTTP屬於應用層協議,在傳輸層使用TCP協議,在網路層使用IP協議。IP協議主要解決網路路由和定址問題,TCP協議主要解決如何在IP層之上可靠的傳遞資料包

form防止重複提交的方法

會引起表單重複提交的情況:f5重新整理頁面, 點選瀏覽器後退,重複點選提交按鈕前臺:1. 提交後按鈕置灰,或者新增蒙板2. PRG模式,表單提交後,redirect到一個倒計時頁面,或者資訊提示頁面,等有成功資訊返回後,再跳轉回之前頁面。3. js中設定標記為判斷後臺:1 s

防止重複提交處理的前後臺兩種處理方式

方法一:session中控制:jsp頁面: //設定標誌變數SubmitFlag值 session.putValue("SubmitFlag","complaint_add.jsp");control層:  public String addxxx(){ Strin

thinkphp令牌防止重複提交

1、在載入表單的控制器程式碼中傳入token $_SESSION['token'] = md5(rand(1,999));//表單令牌防重複操作使用 2、在模板中表單中提交token <i

php 令牌防止重複提交原理

在生成表單的時候,為防止表單重複提交。在form表單中新增一個隱藏的input標籤來存放令牌,等到提交的時候,和表單一起提交。提交以後和生成的session值作比較,通過這種方式來達到防止重複提交的目的。簡要程式碼如下

Struts2 06--系統攔截防止數據重復提交

tab align 提交 中文 mode alt submit import wid 一.攔截器簡要概述 攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或字段被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現

在JSP中常見問題,防止SpringMVC攔截攔截js等靜態資源文件的解決方案

訪問路徑 靜態資源 性能 啟用 所有 默認 fault AD init 方案一、攔截器中增加針對靜態資源不進行過濾(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/*.js"/> <