javascript - 手機表單提交頁面,如果在網路慢的情況下,form表單會提交兩次
手機網站提交頁面,網路好的時候正常,網路慢的時候手機頁面會一直在載入狀態,但是Fiddler抓取卻有兩次相同內容的提交,如何避免這種情況發生?
回覆內容:
手機網站提交頁面,網路好的時候正常,網路慢的時候手機頁面會一直在載入狀態,但是Fiddler抓取卻有兩次相同內容的提交,如何避免這種情況發生?
我的做法是在服務端產生一個token,提交的時候驗證token,這是第一道驗證,第二道驗證為在表單提交時
將提交按鈕設為disabled,一般做個第二種驗證就可以了
<code>// 提交表单数据到后台处理 $.ajax({ type: "post", data: studentInfo, contentType: "application/json", url: "/Home/Submit", beforeSend: function () { // 禁用按钮防止重复提交 $("#submit").attr({ disabled: "disabled" }); }, success: function (data) { if (data == "Success") { //清空输入框 clearBox(); } }, complete: function () { $("#submit").removeAttr("disabled"); }, error: function (data) { console.info("error: " + data.responseText); } });</code>
Csrf 驗證類別
<code><?php // +---------------------------------------------------------------------- // | CSRF安全验证类 @pushaowei // +---------------------------------------------------------------------- // | [Usage] // | // 后端 // | use library\Base\NoCSRF; // | session_start(); // | if ($this->getRequest()->isPost()) { // | // | try { // | ##验证TOKEN // | NoCSRF::check( 'csrf_token', $_POST, true, 60*10, false ); //60*10为10分钟(null为不验证时间) // | $result = 'CSRF check passed. Form parsed.'; // | //$this->getRequest()->getPost('field'); // | echo $result; // | } catch ( Exception $e ) { // | echo $e->getMessage() . ' Form ignored.'; // | } // | } else { // | #生成TOKEN // | $token = NoCSRF::generate( 'csrf_token' ); // | $this->getView()->assign('token', $token); // | $this->getView()->display('页面'); // | } // | // 前端 // | <input type="hidden" name="csrf_token" value="{$token}"> // +---------------------------------------------------------------------- class NoCSRF { protected static $doOriginCheck = false; /** * Check CSRF tokens match between session and $origin. * Make sure you generated a token in the form before checking it. * * @param String $key The session and $origin key where to find the token. * @param Mixed $origin The object/associative array to retreive the token data from (usually $_POST). * @param Boolean $throwException (Facultative) TRUE to throw exception on check fail, FALSE or default to return false. * @param Integer $timespan (Facultative) Makes the token expire after $timespan seconds. (null = never) * @param Boolean $multiple (Facultative) Makes the token reusable and not one-time. (Useful for ajax-heavy requests). * * @return Boolean Returns FALSE if a CSRF attack is detected, TRUE otherwise. */ public static function check( $key, $origin, $throwException=false, $timespan=null, $multiple=false ) { $session = Session::getInstance(); if ( !$session->has( 'csrf_' . $key ) ) if($throwException) throw new \Exception( 'Missing CSRF session token.' ); else return false; if ( !isset( $origin[ $key ] ) ) if($throwException) throw new \Exception( 'Missing CSRF form token.' ); else return false; // Get valid token from session $hash = $session->get('csrf_' . $key); // Free up session token for one-time CSRF token usage. if(!$multiple) $session->forget('csrf_' . $key); // Origin checks if( self::$doOriginCheck && sha1( $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] ) != substr( base64_decode( $hash ), 10, 40 ) ) { if($throwException) throw new \Exception( 'Form origin does not match token origin.' ); else return false; } // Check if session token matches form token if ( $origin[ $key ] != $hash ) if($throwException) throw new \Exception( 'Invalid CSRF token.' ); else return false; // Check for token expiration if ( $timespan != null && is_int( $timespan ) && intval( substr( base64_decode( $hash ), 0, 10 ) ) + $timespan < time() ) if($throwException) throw new \Exception( 'CSRF token has expired.' ); else return false; return true; } /** * Adds extra useragent and remote_addr checks to CSRF protections. */ public static function enableOriginCheck() { self::$doOriginCheck = true; } /** * CSRF token generation method. After generating the token, put it inside a hidden form field named $key. * * @param String $key The session key where the token will be stored. (Will also be the name of the hidden field name) * @return String The generated, base64 encoded token. */ public static function generate( $key ) { $session = Session::getInstance(); $extra = self::$doOriginCheck ? sha1( $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] ) : ''; // token generation (basically base64_encode any random complex string, time() is used for token expiration) $token = base64_encode( time() . $extra . self::randomString( 32 ) ); // store the one-time token in session $session->put('csrf_' . $key, $token); return $token; } /** * Generates a random string of given $length. * * @param Integer $length The string length. * @return String The randomly generated string. */ protected static function randomString( $length ) { $seed = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijqlmnopqrtsuvwxyz0123456789'; $max = strlen( $seed ) - 1; $string = ''; for ( $i = 0; $i < $length; ++$i ) $string .= $seed{intval( mt_rand( 0.0, $max ) )}; return $string; } } ?></code>
肯定是點擊一次,提交一次,不可能因為網路慢就出現你點一次提交兩次的情況——事件的觸發,怎麼可能像無根之水一樣的?如果真有這種情況,那一定就是你程式碼的問題了
額,沒必要那麼複雜吧。
你看下兩個請求header
,是不是第一個請求down掉了,排除下是不是兩次點擊
導致的(如果是點擊導致的,點擊之後禁用dom元素的點擊事件),或者是代碼部分原因
導致的。
順帶發下你請求的程式碼
和Fiddler
捕獲的資料。
提交兩次的原因大致有兩種:
一,點擊事件觸發兩次(這種情況不分網速快慢)
這種多是由於一些js插件造成的,需要google一下來處理,比較常見的是iscroll.js
會造成事件執行兩次,網上有很多方案.
二,是網速忙,用戶等不及,多次點擊
一定要在將要ajax
前把按鈕disabled
掉,如果ajax
前把按鈕disabled
掉,如果表單是可以多次提交的,在

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

HTML定義網頁結構,CSS負責樣式和佈局,JavaScript賦予動態交互。三者在網頁開發中各司其職,共同構建豐富多彩的網站。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

React通過JSX與HTML結合,提升用戶體驗。 1)JSX嵌入HTML,使開發更直觀。 2)虛擬DOM機制優化性能,減少DOM操作。 3)組件化管理UI,提高可維護性。 4)狀態管理和事件處理增強交互性。
