AOP+Token防止表单重复提交
表单重复提交:
由于用户误操作,多次点击表单提交按钮
由于网速等原因造成页面卡顿,用户重复刷新提交页面
避免表单重复提交的方式:
1.页面上的按钮做防重复点击操作
2.在数据库中可以做唯一约束
3.利用token校验重复提交
如何利用token校验表单重复提交
思路:在表单提交前先请求后台获取token,后台随机生成token保存在session中,提交表单时在请求参数中带上获取的token即可,后台校验token是否匹配。
token的获取和校验可以统一写在AOP切面类中。
自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Token {
boolean save() default false ;
boolean remove() default false ;
}
切面类
@Aspect
@Component
public class TokenAspect { @SuppressWarnings("unused")
@Before("within(@org.springframework.stereotype.Controller *) && @annotation(token)")
public void testToken(final JoinPoint joinPoint, Token token){
try {
if (token != null) {
//获取 joinPoint 的全部参数
Object[] args = joinPoint.getArgs();
HttpServletRequest request = null;
HttpServletResponse response = null;
for (int i = ; i < args.length; i++) {
//获得参数中的 request && response
if (args[i] instanceof HttpServletRequest) {
request = (HttpServletRequest) args[i];
}
if (args[i] instanceof HttpServletResponse) {
response = (HttpServletResponse) args[i];
}
} boolean needSaveSession = token.save();
if (needSaveSession){
String uuid = UUID.randomUUID().toString();
request.getSession().setAttribute( "token" , uuid);
System.out.println("进入表单页面,Token值为:"+uuid);
} boolean needRemoveSession = token.remove();
if (needRemoveSession) {
if (isRepeatSubmit(request)) {
System.out.println("表单重复提交");
throw new FormRepeatException("表单重复提交");
}
request.getSession(false).removeAttribute( "token" );
}
} } catch (FormRepeatException e){
throw e;
} catch (Exception e){
e.printStackTrace();
throw e;
}
} private boolean isRepeatSubmit(HttpServletRequest request) throws FormRepeatException {
String serverToken = (String) request.getSession( false ).getAttribute( "token" );
if (serverToken == null ) {
return true;
}
String clinetToken = request.getParameter( "token" );
if (clinetToken == null || clinetToken.equals("")) {
return true;
}
if (!serverToken.equals(clinetToken)) {
return true ;
}
System.out.println("校验是否重复提交:表单页面Token值为:"+clinetToken + ",Session中的Token值为:"+serverToken);
return false ;
}
}
全局异常处理
@ControllerAdvice
public class ControllerAdviceHandler { @ResponseBody
@ExceptionHandler(value={com.irish.exception.FormRepeatException.class})
public String arithmeticExceptionHandler(Exception e){
return "您重复提交表单了!";
} }
自定义异常
public class FormRepeatException extends RuntimeException {
private static final long serialVersionUID = 1L;
public FormRepeatException(String message){ super(message);}
}
controller层
@Controller
public class URLController { /**
* 获取token,并将token保存在session中
* @return
*/
@Token(save = true)
@RequestMapping("/queryToken")
@ResponseBody
public String getToken(HttpServletRequest request, HttpServletResponse response){
return (String) request.getSession().getAttribute("token");
} /**
* 提交表单的地址,在AOP中检查表单是否重复提交,将token删除
* @param request
* @param response
* @return
*/
@Token(remove = true)
@RequestMapping("/submitFrom")
@ResponseBody
public String removeToken(HttpServletRequest request, HttpServletResponse response){
return "success";
}
}
项目结构:

github下载地址:https://github.com/jake1263/form-repeat-submit
AOP+Token防止表单重复提交的更多相关文章
- PHP简单利用token防止表单重复提交
<?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_S ...
- PHP生成token防止表单重复提交
.提交按钮置disabled 当用户提交后,立即把按钮置为不可用状态.这种用js来实现. 提交前代码如下: $() { $exec="insert into student (user_ ...
- PHP简单利用token防止表单重复提交(转)
<?php/* * PHP简单利用token防止表单重复提交 */function set_token() { $_SESSION['token'] = md5(microtime(true)) ...
- php通过token验证表单重复提交
PHP防止重复提交表单 2016-11-08 轻松学PHP 我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后 ...
- PHP使用token防止表单重复提交的方法
本文实例讲述了PHP使用token防止表单重复提交的方法.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...
- java后端使用token处理表单重复提交
保证接口幂等性,表单重复提交 前台解决方案:提交后按钮禁用.置灰.页面出现遮罩后台解决方案: 使用token,每个token只能使用一次1.在调用接口之前生成对应的Token,存放至redis 2 ...
- token防止表单重复提交
出现表单重复提交的三种情况: 一.服务器响应缓慢,用户多次点击提交按钮. 二.提交成功后刷新页面. 三.提交成功后返回表单页面再次点击提交. package com.jalja.token; impo ...
- Struts2笔记——利用token防止表单重复提交
在一些项目中经常会让用户提交表单,当用户点击按钮提交后,如果再次浏览器刷新,这就会造成表单重复提交,若是提交的内容上传至服务器并请求数据库保存,重复提交的表单可能会导致错误,然后跳转到错误界面,这是一 ...
- Token防止表单重复提交和CSRF攻击
Token,可以翻译成标记!最大的特点就是随机性,不可预测,一般黑客或软件无法猜测出来. Token一般用在两个地方: 1: 防止表单重复提交 2: anti csrf攻击(Cross-site re ...
随机推荐
- 关于异常System.ArgumentException
什么是System.ArgumentException 当向方法提供的参数之一无效时引发的异常. 继承 Object Exception SystemException ArgumentExcepti ...
- Why We Changed YugaByte DB Licensing to 100% Open Source
转自:https://blog.yugabyte.com/why-we-changed-yugabyte-db-licensing-to-100-open-source/ 主要说明了YugaByte ...
- P4218 [CTSC2010]珠宝商
P4218 [CTSC2010]珠宝商 神题... 可以想到点分治,细节不写了... (学了个新姿势,sam可以在前面加字符 但是一次点分治只能做到\(O(m)\),考虑\(\sqrt n\)点分治, ...
- 洛谷 P4779 【模板】单源最短路径(标准版) 题解
P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 100 ...
- 洛谷 P3380 【模板】二逼平衡树(树套树)-线段树套splay
P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...
- javascript 中的方法注入
js 中的方法注入 java中很多框架支持 apo 的注入, js中也可以类似的进行实现 主要是通过扩展js中方法的老祖 Function 对象来进行实现. Function.prototype.af ...
- EasyEarth三维可视化解决方案——智慧林业
智慧林业 智能巡管监护 护林员信息查询 护林员管护范围查询 护林员报警.采集数据查看 样点.样线管理 其它功能模块 ●一键考勤打卡 ●面积测量 ●任务公告发布 ●实时电量监控 ●一键报警功能 ●北斗短 ...
- [内网渗透]Cobaltstrike指令大全
0x01 安装 Cobaltstrike是需要java环境才能运行的 linux下终端运行: sudo apt-get install openjdk-8-jdk windows下: 百度一堆配置JA ...
- Git基本介绍(三大分区及核心内部构造)
1. Git三大工作区(工作区.暂存区和版本库) 工作区(WORKING DIRECTORY): 直接编辑文件的地方,肉眼可见直接操作: 暂存区(STAGIN AREA):数据(快照)暂时存放的地方: ...
- 重新学习MySQL数据库12:从实践sql语句优化开始
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...