springmvc 攔截器 防止重複提交表單
第一種方法:判斷session中儲存的token
比較麻煩,每次在提交表單時都必須傳入上次的token。而且當一個頁面使用ajax時,多個表單提交就會有問題。
註解Token程式碼:
- package com.thinkgem.jeesite.common.repeat_form_validator;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
-
import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- * 頁面form token
- * @author Administrator
- *
- */
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public@interface FormToken {
- boolean save() defaultfalse;
- boolean remove() defaultfalse;
- }
攔截器TokenInterceptor程式碼:
- package com.thinkgem.jeesite.common.repeat_form_validator;
- import java.lang.reflect.Method;
- import java.util.UUID;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.method.HandlerMethod;
-
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
- publicclass FormTokenInterceptor extends HandlerInterceptorAdapter {
- @Override
- publicboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- if (handler instanceof HandlerMethod) {
- HandlerMethod handlerMethod = (HandlerMethod) handler;
- Method method = handlerMethod.getMethod();
- FormToken annotation = method.getAnnotation(FormToken.class);
- if (annotation != null) {
- boolean needSaveSession = annotation.save();
- if (needSaveSession) {
- request.getSession(false).setAttribute("formToken", UUID.randomUUID().toString());
- }
- boolean needRemoveSession = annotation.remove();
- if (needRemoveSession) {
- if (isRepeatSubmit(request)) {
- returnfalse;
- }
- request.getSession(false).removeAttribute("formToken");
- }
- }
- returntrue;
- } else {
- returnsuper.preHandle(request, response, handler);
- }
- }
- privateboolean isRepeatSubmit(HttpServletRequest request) {
- String serverToken = (String) request.getSession(false).getAttribute("formToken");
- if (serverToken == null) {
- returntrue;
- }
- String clinetToken = request.getParameter("formToken");
- if (clinetToken == null) {
- returntrue;
- }
- if (!serverToken.equals(clinetToken)) {
- returntrue;
- }
- returnfalse;
- }
- }
然後在Spring MVC的配置檔案里加入:
- <mvc:interceptors>
- <mvc:interceptor>
- <mvc:mapping path="/**"/>
- <bean class="com.thinkgem.jeesite.common.repeat_form_validator.FormTokenInterceptor"/>
- </mvc:interceptor>
- </mvc:interceptors>
相關程式碼已經註釋,相信你能看懂。
關於這個方法的用法是:在需要生成token的controller上增加@FormToken(save=true),而在需要檢查重複提交的controller上新增@FormToken(remove=true)就可以了。
另外,你需要在view裡在form裡增加下面程式碼:
- <inputtypeinputtype="hidden"name="formToken"value="${formToken}"/>
已經完成了,去試試看你的資料還能重複提交了吧。
注意在ajax提交時 要加上 formToken引數
第二種方法(判斷請求url和資料是否和上一次相同)
推薦,非常簡單,頁面不需要任何傳入,只需要在驗證的controller方法上寫上自定義註解即可
寫好自定義註解
- package com.thinkgem.jeesite.common.repeat_form_validator;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- * 一個使用者 相同url 同時提交 相同資料 驗證
- * @author Administrator
- *
- */
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public@interface SameUrlData {
- }
記一次 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"/> <