服務(wù)器端使用Session來防止表單重復(fù)提交

解決思路:

  • 表單不能由HTML頁面輸出彪杉,須有程序生成輸出
  • 程序輸出表單時需在表單里添加一個隨機(jī)數(shù)打給瀏覽器
  • 用戶提交表單時把這個隨機(jī)數(shù)帶給服務(wù)器程序
  • 用戶帶過來的隨機(jī)數(shù)和服務(wù)器隨機(jī)數(shù)進(jìn)行比較奕剃,若一致則接受昼窗,否則不予接受

具體的做法:

在服務(wù)器端生成一個唯一的隨機(jī)標(biāo)識號鬼佣,專業(yè)術(shù)語稱為Token(令牌),同時在當(dāng)前用戶的Session域中保存這個Token辨绊。然后將Token發(fā)送到客戶端的Form表單中敞咧,在Form表單中使用隱藏域來存儲這個Token,表單提交的時候連同這個Token一起提交到服務(wù)器端柬脸,然后在服務(wù)器端判斷客戶端提交上來的Token與服務(wù)器端生成的Token是否一致他去,如果不一致,那就是重復(fù)提交了倒堕,此時服務(wù)器端就可以不處理重復(fù)提交的表單灾测。如果相同則處理表單提交,處理完后清除當(dāng)前用戶的Session域中存儲的標(biāo)識號垦巴。

在下列情況下媳搪,服務(wù)器程序?qū)⒕芙^處理用戶提交的表單請求:

  • 存儲Session域中的Token(令牌)與表單提交的Token(令牌)不同。
  • 當(dāng)前用戶的Session中不存在Token(令牌)骤宣。
  • 用戶提交的表單數(shù)據(jù)中沒有Token(令牌)秦爆。

代碼實現(xiàn):

  • form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>form.html</title>
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <script type="text/javascript">
        var isCommitted = false;
        function dosubmit()
        {
            if(isCommitted==false){
                isCommitted = true;
                return true;
            }else{
                return false;
            }
                
        }
        function dosubmit(){
            var submit = document.getElementById("submit");
            submit.disabled= "disabled";
            return true;
        
        }
    </script>


  </head> 
  <body>    
    <form action="~這里是你表單提交的servlet路徑~/FormServlet" method="post" onsubmit="return dosubmit()">
        用戶名:<input type="text" name="username">
        <input type="submit" value="提交" id="submit">
    </form>
  </body>
</html>

//負(fù)責(zé)產(chǎn)生表單
public class FormServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        String token = TokenProccessor.getInstance().makeToken();
        request.getSession().setAttribute("token", token);  //在服務(wù)器端保存隨機(jī)數(shù)
        
        out.println("<form action='/day07/servlet/DoFormServlet' method='post'>");
            out.write("<input type='hidden' name='token' value='"+token+"'>");
            out.println("用戶名:<input type='text' name='username'>");
            out.println("<input type='submit' value='提交'>");
        out.println("</form>");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }
}
  • 表單提交處理,如果不是不是重復(fù)提交則進(jìn)行處理
public class DoFormServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        
        boolean b = isToken(request);  //判斷用戶是否是重復(fù)提交
        if(b==true){
            System.out.println("請不要重復(fù)提交");
            return;
        }
        
        request.getSession().removeAttribute("token");//移除session中的token
        
        System.out.println("處理用戶提交請求c九等限!");
        
    }

  /**
         * 判斷客戶端提交上來的令牌和服務(wù)器端生成的令牌是否一致
         * @param request
         * @return 
         *         true 用戶重復(fù)提交了表單 
         *         false 用戶沒有重復(fù)提交表單
         */

    private boolean isToken(HttpServletRequest request) {
        
        String client_token = request.getParameter("token");
        //1爸吮、如果用戶提交的表單數(shù)據(jù)中沒有token,則用戶是重復(fù)提交了表單
        if(client_token==null){
            return true;
        }
        //取出存儲在Session中的token
        String server_token = (String) request.getSession().getAttribute("token");
        //2望门、如果當(dāng)前用戶的Session中不存在Token(令牌)形娇,則用戶是重復(fù)提交了表單
        if(server_token==null){
            return true;
        }
        //3、存儲在Session中的Token(令牌)與表單提交的Token(令牌)不同筹误,則用戶是重復(fù)提交了表單
        if(!client_token.equals(server_token)){
            return true;
        }
        
        return false;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桐早,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厨剪,更是在濱河造成了極大的恐慌哄酝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷膳,死亡現(xiàn)場離奇詭異陶衅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)直晨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門万哪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抡秆,你說我怎么就攤上這事∫鞑撸” “怎么了儒士?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長檩坚。 經(jīng)常有香客問我着撩,道長,這世上最難降的妖魔是什么匾委? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任拖叙,我火速辦了婚禮,結(jié)果婚禮上赂乐,老公的妹妹穿的比我還像新娘薯鳍。我一直安慰自己,他們只是感情好挨措,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布挖滤。 她就那樣靜靜地躺著,像睡著了一般浅役。 火紅的嫁衣襯著肌膚如雪斩松。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天觉既,我揣著相機(jī)與錄音惧盹,去河邊找鬼乳幸。 笑死,一個胖子當(dāng)著我的面吹牛钧椰,可吹牛的內(nèi)容都是我干的粹断。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼演侯,長吁一口氣:“原來是場噩夢啊……” “哼姿染!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秒际,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悬赏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娄徊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闽颇,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年寄锐,在試婚紗的時候發(fā)現(xiàn)自己被綠了兵多。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡橄仆,死狀恐怖剩膘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盆顾,我是刑警寧澤怠褐,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站您宪,受9級特大地震影響奈懒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宪巨,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一磷杏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捏卓,春花似錦极祸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至龄寞,卻和暖如春汰规,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背物邑。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工溜哮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留滔金,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓茂嗓,卻偏偏與公主長得像餐茵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子述吸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在平時開發(fā)中忿族,如果網(wǎng)速比較慢的情況下,用戶提交表單后蝌矛,發(fā)現(xiàn)服務(wù)器半天都沒有響應(yīng)道批,那么用戶可能會以為是自己沒有提交表...
    重山楊閱讀 1,751評論 5 26
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)入撒,斷路器隆豹,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 具體的做法:在服務(wù)器端生成一個唯一的隨機(jī)標(biāo)識號,專業(yè)術(shù)語稱為Token(令牌)茅逮,同時在當(dāng)前用戶的Session域中...
    大蝦咪閱讀 230評論 0 0
  • 原則璃赡,少而精。 形式∶面授献雅、借力他人和小團(tuán)體座談碉考。 成果∶讓自己值錢 1.馬捷克,二校六(4)班挺身。小萍同學(xué)的兒子豆励。...
    行一館閱讀 339評論 0 0
  • 1.專注一件重要的事 如何判斷一件事情是不是很重要?就看它是不是在你人生當(dāng)中是不可缺少的瞒渠,是不是解決了這個問題,其...
    好聽的暖陽閱讀 215評論 2 3