Java的token解决方案,SpringMVC后台token防重复提交解决方案
思路1.添加拦截器,拦截需要防重复提交的请求
2.通过注解@Token来添加token/移除token 3.前端页面表单添加(如果是Ajax请求则需要在请求的json数据中添加token值)
核心源码
拦截器源码实现/**
* com.xxx.interceptor.TokenInterceptor.java
* Copyright 2018 Lifangyu, Inc. All rights reserved.
*/package com.xxx.common.interceptor;import org.apache.log4j.Logger;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.lang.reflect.Method;import java.util.Random;import java.util.UUID;/**
* Desc:防重复提交的拦截器
*
* Created by lifangyu on 2018/02/27.
*/public class TokenInterceptor extends HandlerInterceptorAdapter {
Logger logger = Logger.getLogger(TokenInterceptor.class); static String splitFlag = "_"; @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
Token annotation = method.getAnnotation(Token.class); if (annotation == null) { return true;
}
boolean needSaveSession = annotation.add(); if (needSaveSession) {
Random random = new Random();
String uuid = UUID.randomUUID().toString().replace(splitFlag, String.valueOf(random.nextInt(100000)));
String tokenValue = String.valueOf(System.currentTimeMillis());
request.setAttribute("token", uuid + splitFlag + tokenValue); // session 中 token 的key 每次都是变化的[适应浏览器 打开多个带有token的页面不会有覆盖session的key]
request.getSession(true).setAttribute(uuid, tokenValue);
} boolean needRemoveSession = annotation.remove(); if (needRemoveSession) { if (isRepeatSubmit(request)) {
logger.warn("please don't repeat submit,url:" + request.getServletPath()); return false;
}
String clinetToken = request.getParameter("token"); if (clinetToken != null && clinetToken.indexOf(splitFlag) > -1) {
request.getSession(true).removeAttribute(clinetToken.split("_")[0]);
}
} return true;
} else { return super.preHandle(request, response, handler);
}
} /**
* 判断是否是重复提交
*
* @param request
* @return
*/
private boolean isRepeatSubmit(HttpServletRequest request) {
String clinetToken = request.getParameter("token"); if (clinetToken == null) { return true;
}
String uuid = clinetToken.split("_")[0];
String token = clinetToken.split("_")[1];
String serverToken = (String) request.getSession(true).getAttribute(uuid); if (serverToken == null) { return true;
} if (!serverToken.equals(token)) { return true;
} return false;
}
}
注解源码/**
* com.xxx.interceptor.Token.java
* Copyright 2018 Lifangyu, Inc. All rights reserved.
*/package com.xxx.common.interceptor;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/**
* Desc:Token 注解
*
* Created by lifangyu on 2018/02/27.
*/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Token { /**
* 添加token的开关[true:添加;false:不添加,default:false]
*
* @return
*/
boolean add() default false; /**
* 移除token的开关[true:删除;false:不删除,default:false]
*
* @return
*/
boolean remove() default false;
}
拦截器的配置
在springMVC的servlet配置文件中配置拦截器
使用指南
1.在进入页面的controller方法上添加注解@Token(add=true)@Token(add = true)@RequestMapping("toXxxHtml")public String toXxxHtml(Model mv) {
...... return "xxx/xxxHtml";
}
2.在页面toXxxHtml.html添加
......
......
3.在防止重复提交的controller方法上添加@Token(remove = true)@Token(remove = true)@RequestMapping("addXxx")public String addXxx() throws Exception {
...... return "redirect:toXxxHtml.do";
}
原文出处:https://www.cnblogs.com/yclimb/p/9934106.html
Java的token解决方案,SpringMVC后台token防重复提交解决方案相关推荐
- 架构设计 | 接口幂等性原则,防重复提交Token管理
本文源码:GitHub·点这里 || GitEE·点这里 一.幂等性概念 1.幂等简介 编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.就是说,一次和多次请求某一个资源会产 ...
- 处理接口超时_架构设计 | 接口幂等性原则,防重复提交Token管理
一.幂等性概念 1.幂等简介 编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.就是说,一次和多次请求某一个资源会产生同样的作用影响. 2.HTTP请求 遵循Http协议的请 ...
- AOP+自定义注解token令牌和参数防重复提交实战
目录 一.哪些因素会引起重复提交? 二.重复提交会带来哪些问题? 三.订单的防重复提交你能想到几种方案? 四.自定义注解方式 4.1Java核心知识-自定义注解(先了解下什么是自定义注解) 4.1.1 ...
- java后端 防重复提交_后台防止表单重复提交
具体的做法: 1.获取用户填写用户名和密码的页面时向后台发送一次请求,这时后台会生成唯一的随机标识号,专业术语称为Token(令牌). 2.将Token发送到客户端的Form表单中,在Form表单中使 ...
- Java实现防重复提交
欢迎访问我的个人博客:www.ifueen.com 防重复提交的重要性? 在业务开发中,为什么我们要去想办法解决重复提交这一问题发生?网上的概念很多:导致表单重复提交,造成数据重复,增加服务器负载,严 ...
- Token注解防止表单的重复提交
注解的一些基础: 参见http://blog.csdn.net/duo2005duo/article/details/50505884和 http://blog.csdn.net/duo2005duo ...
- 关于防重复提交出现 页面过期的问题
在做包剪锤游戏时,下注的时候提交一个json 请求.不断的刷新后,点击下注,提示页面过期. 经分析研究有如下疑问: 1.页面已经产生了新的token, 点击下注按钮 ,匹配session中的token ...
- 关于表单防重复提交一些东东
前阵子弄了些表单防重复提交的东西,想整理整理,免得下次要用时再四处去找,其实这里的东西还是挺简单的. 原理: 在Session中保存一个表单的唯一编号,将该编号放在一个隐藏域中,同其他数据一同提交.在 ...
- springBoot防重复提交
一.重复提交原因 由于客户端抖动,人为快速点击,造成服务器重复处理 二.后端防重复提交 1.基于token 访问请求到达服务器,服务器端生成token,分别保存在客户端和服务器.提交请求到达服务器,服 ...
最新文章
- 中小企业数据异地备份容灾解决方案
- C语言数据类型本质分析
- 1.15.Flink state(状态)管理与恢复、什么是state、Keyed State、Operator State、状态容错(生成快照,恢复快照),checkPoint简介,重启策略等
- mysql 索引效果是否叠加_MySQL基础实用知识集合(二)
- 图像的旋转和尺度缩放在对数极坐标系下的研究
- JPA Annotation注解
- java支付宝rsa2签名_sign_tools_RSA256_win
- python使得ffmpeg更加强大
- new运算符与malloc函数区别
- Linux命令大全:grep命令
- 实习踩坑之路:快速失败:使用stream流便利集合的时候删除了对象,导致抛错Null
- linux怎么进入windows系统安装目录下,windows下Linux子系统的安装配置
- abb机器人伺服电机报闸是什么_什么是抱闸电机
- navicat 1146错误
- matlab将txt转成dat,将matlab中数据保存为txt或dat格式
- Vue学习(一)从 mvx模式 到 mvvm模式
- 路演商业计划书PPT模板
- A股将迎来一大波新经济公司:几家欢喜几家愁
- 油猴插件的介绍和安装详解脚本的介绍和添加举例
- Maven项目 混合编译Java和Scala
热门文章
- 大佬谈:英伟达、咪咕、赛迪共谈技术如何颠覆未来市场
- 扎克伯格拒绝参加加拿大议会 或因藐视罪名被拘留
- 哈啰出行回应单车违规投放:将尽快缴纳罚金 积极整改
- 公司“凉凉”都怪大楼风水?望京SOHO诉自媒体案正式开庭
- 易到用车提现再度被延期?!声明:因贾跃亭所欠债务导致
- 除去WebView默认存在的一定像素的边距问题
- Java成神之路——ASM,Javassist,cglib区别。
- html 弹出一个邮件连接,mailto scheme 高级用法, 显示带html样式的邮件文本
- 前端md转html添加样式_前端文档站点搭建方案
- 程序员打字练习_程序员必须来看的面试圣经!!