JavaWeb 如何防止表单重复提交 - 使用Token,令牌

JavaWeb 如何防止表单重复提交 - 使用Token,令牌

说到重复提交 ,应该想到两种场景:
1. 在下单,或者支付 这种情况 那么不允许  刷新,不允许后退再点击提交(后退之后提交会失败,修改了也不行)。
2. 在填写表单之后,提交完成之后,不允许 刷新,但是允许 返回之后 提交,给用户修改表单的机会。

解决方法

首先可以防止用户刷新,处理完成之后用Redirect的方式 跳转到success页面,这样刷新则没有用。但是返回的时候还可以提交一次缓存的数据。
 
然后 使用令牌,在页面表单生成一个token, 这是在请求页面的时候产生的,放在隐藏域之中。然后把token存在session中。
提交之后,判断这两个token是否一样,是一样则通过,并且清除session 中的 token,这样就能防止返回之后再次提交,因为返回的时候点击提交读取的是缓存,但是session已经没有这个token了。这适用于场景1
 
对于场景2,直接禁止缓存,那么返回的时候一定重新请求 表单,用户可以再次填写。在用token的情况下,session中的 token总是和 隐藏域中的一致。
 
在使用令牌的情况下,如果用户没有重新请求表单,并且恶意提交之前的Post数据,则在服务器端,session里面的token已经被清空且没有重新请求,则session的token为空不能通过。
<body><%long token=System.currentTimeMillis();    //产生时间戳的tokensession.setAttribute("token",token);    %><form  action="isRepeat" method="post"><input type="text"  name="username"/><input type="text"  name="password"/><input type="hidden" value="<%=token %>" name="Reqtoken"/>   <!-- 作为hidden提交 --><input type="submit" value="提交"/></form>
</body>


String token = req.getParameter("Reqtoken");// 获取表单上面的时间戳T1HttpSession session=req.getSession();String tokenInSession  =  ""+session.getAttribute("token");System.out.println("Session in Token: " + tokenInSession);System.out.println("表单的Token:" + token+"\n------------");if (tokenInSession!=null && token!=null && token.equals(tokenInSession)) { resp.getWriter().println("ok ");session.removeAttribute("token");} else { //如果禁止缓存,返回会 重新请求,tokenInSession  是不会为空的System.out.println("重复提交,或者有错误");//或者有错误,直接访问servlet等resp.sendRedirect("index.jsp");return;}resp.sendRedirect("success.jsp"); //此句子导致刷新无效


禁止缓存的方法,参见另一篇文章。
另一种方法: 该方法原理是 记住上一次提交的 页面token。将本次的token和上次比对,如果一样说明重复提交。该方法不需要禁用缓存。
 String token = req.getParameter("Reqtoken");// 获取表单上面的时间戳HttpSession session=req.getSession();String LasttokenInSession  =  (String) session.getAttribute("Lasttoken");//System.out.println("------------\nToken in Session: " + tokenInSession);System.out.println("表单的Token:" + token);System.out.println("上一次表单的Token:" + LasttokenInSession);//token!=null 是防止用户直接打开本servlet页面。LasttokenInSession是空,说明是第一次提交 ,和上一次不想等则说明不是重复提交if(token!=null && (LasttokenInSession ==null || !LasttokenInSession.equals(token)) ) {session.removeAttribute("token");//Token 清空session.setAttribute("Lasttoken",token);// 保存上一次}else { resp.getWriter().println("<h1>表单页面无效,请返回并且刷新页面</h1>");resp.getWriter().println("<h1><a href=\""+ "index.jsp" +"\">返回并刷新</a></h1>");resp.getWriter().println("Do not Duplicate submit!");return;}resp.sendRedirect("success.jsp"); //此句子导致刷新无效


 

转载于:https://www.cnblogs.com/slankka/p/9158541.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle之创建和管理表之练习题

51. 利用子查询创建表 myemp, 该表中包含 employees 表的 employee_id(id), last_name(name), salary(sal), email 字段1). 创建表的同时复制 employees 对应的记录create table myemp asselect employee_id id, last_name name, salary sal, email from employees 2). 创建表…

android icu4c 7.1编译报错,android4.0编译系统时候遇到的错误集

1、Android library XXX.so not in prelink map 错误解决在编译自己的Android library时可能会出现library XXX.so not in prelink map 错误&#xff0c;这是由于Android的预编译设置引起的&#xff0c;/build/core/prelink-linux-arm.map文件描述了预编译的模块需要修改所在文…

oracle之数据处理

--创建表 create table emp3 as select employee_id,last_name,hire_date,salary from employees--查询表 select * from emp3--插入表 insert into emp3 values(1001,AA,sysdate,10000) 运行结果 插入对应三项 --空值用null代替 --复制表 insert into emp3(last_name,employe…

HDU 4635(强连通分量分解

题目:给出一个有向图,要求添加最多的边数,使得图仍然不强连通. 思路:首先这个图在添加边之后肯定变成了两个强连通分量,现在就看怎么分.然后我们可以注意到,原图进行强连通分量分解之后必然存在一些分量的出度或入度为0,最小的分量肯定在这些分量之中.那么找出这个分量就可以得…

Android方法的概括,android中的Filter接口简介

一、结构public abstract class Filter extends Objectjava.lang.Objectandroid.widget.Filter二、概述过滤器通过过滤模式来约束数据&#xff0c;通常由实现了Filterable接口的子类来生成。 过滤操作是通过调用filter(CharSequence)或者filter(CharSequence, android.widget.F…

oracle之数据处理之课后练习

55. 更改 108 员工的信息: 使其工资变为所在部门中的最高工资, job 变为公司中平均工资最低的 job1). 搭建骨架update employees set salary (), job_id () where employee_id 108;2). 所在部门中的最高工资 select max(salary)from employeeswhere department_id (select …

nyoj--79--导弹拦截(动态规划)

拦截导弹 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;3描述 某国为了防御敌国的导弹袭击&#xff0c;发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一…

android webview 长按菜单拦截,javascript-在Android上长按时禁用上下文菜单

javascript-在Android上长按时禁用上下文菜单我想禁用长按(触摸并按住)Web应用程序中的图像后出现的上下文菜单。 我见过关于如何做到这一点的不同想法&#xff0c;但似乎没有一个对我有用。有没有办法通过HTML / CSS / Javascript在Android上执行此操作&#xff1f;12个解决方…

oracle之数据处理之约束1

--创建表 create table emp4( id number(10) constraint emp2_id_nn not null, name varchar2(20) not null, salaty number(10,2) )--查询表 select *from emp4--插入 insert into emp4 values(1001,geyao,2000) 运行结果 --创建表 create table emp5( --列级约束 id numbe…

java中注解的使用与实例(一)

注解目前非常的流行&#xff0c;很多主流框架都支持注解&#xff0c;而且自己编写代码的时候也会尽量的去用注解&#xff0c;一时方便&#xff0c;而是代码更加简洁。 注解的语法比较简单&#xff0c;除了符号的使用之外&#xff0c;它基本与Java固有语法一致。Java SE5内置了三…

android sqlite 操作类封装,[Android] Sqlite 数据库操做 工具封装类

sqlite 数据库封装类htmlDatabaseUtil.java(封装的类)javapackagecom.jack.androidbase.tools;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLite…

oracle之数据处理之约束2

--修改约束 alter table emp5 modify (salary number(10,2) not null)运行结果 --删除约束 alter table emp5 drop constraint emp5_name_nn 运行结果

css实现一个写信的格式

一、目标 目标实现如下效果&#xff1a; 二、完成 1、分析 这个效果看起来很简单&#xff0c;实际上可能并不那么容易实现。 首先是全部东西都居中显示&#xff0c;除了“亲爱的starof”这个称呼的地方。这也是难点&#xff0c;也是本文要重点说的地方。 开始我尝试将“ 亲爱的…

android 6.0版本名字,棉花糖Marshmallow 是Android 6.0的名字

Android 6.0 五月下旬在 I/O 大会上亮相&#xff0c;将于今年秋天与用户见面。但是依照惯例&#xff0c;谷歌并没有宣布新 Android 的代号全称&#xff0c;而 Android M 中 M 所代表的甜品&#xff1a;Marshmallow(棉花糖)。并不是MM巧克力豆&#xff0c;巧克力豆的粉丝&#x…

Java达到MySQL数据库备份(两)

博客《Java实现MySQL数据库备份&#xff08;一&#xff09;》使用I/O流的方式实现了MySQL数据库的备份&#xff0c;这样的方法比較繁杂。以下介绍还有一种备份MySQL数据库的方法&#xff1a; import java.io.File; import java.io.IOException;/*** MySQL数据库备份* * author …

找不到android的sdk,CircleCI – 找不到Android Studio项目的SDK位置

尝试在CircleCI上构建项目时,在gradle构建期间发生以下错误.这个问题的原因是什么&#xff1f;我正在运行CircleCI 2.0.FAILURE: Build failed with an exception.What went wrong: A problem occurred configuring project ‘:app’.SDK location not found. Define location …

选项卡,下拉菜单操做时的页面数据更新,highcharts,d3 结合。

1.选项卡&#xff1a;给要选中的元素添加css样式&#xff0c;加active&#xff0c;单击时先移除active&#xff0c;再把当前单击元素添加active。 单击时页面切换&#xff0c;按钮和页面要有关联&#xff0c;通过获取$(this).text();年龄&#xff0c;教育&#xff0c;职业&…

oracle之数据处理之约束练习

57. 定义非空约束1). 非空约束只能定义在列级.2). 不指定约束名create table emp2 (name varchar2(30) not null, age number(3));3). 指定约束名 create table emp3(name varchar2(30) constraint name_not_null not null, age number(3));58. 唯一约束1). 列级定义①. 不指定…

小米9android系统怎么关闭,小米MIUI系统怎么禁用虚拟键 小米MIUI系统禁用虚拟键方法...

想新很多米粉对对miui系统不会陌生。这个系统还很是不错。但是刚刚入手小米手机的米粉可能就不太熟悉了。那么&#xff0c;虚拟键要怎么去禁用呢&#xff1f;下面就一起来看看小米MIUI系统虚拟键禁用方法。大家用安卓手机的时候是否曾遇到过以下折磨人的场景&#xff1a;小米MI…