package com.future.interceptor;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import com.baoqilai.scp.web.RestResultGenerator;
import com.future.shiro.ShiroUtils;
import com.google.common.cache.Cache; @Aspect
@Component
public class NoRepeatSubmitAop { private static final Logger logger = LoggerFactory.getLogger(NoRepeatSubmitAop.class); @Autowired
private Cache<String, Integer> cache; @Around("execution(* com.future.controller.*.*.*(..))&& @annotation(nos)")
public Object arround(ProceedingJoinPoint pjp, NoRepeatSubmit nos) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String sessionId = ShiroUtils.getSession().getId().toString();
HttpServletRequest request = attributes.getRequest();
String key = sessionId + "-" + request.getServletPath();
if (cache.getIfPresent(key) != null) {
logger.error("重复提交");
return RestResultGenerator.genErrorResult("重复请求,请稍后再试");
}
// 如果是第一次请求,就将 key 当前对象压入缓存中
cache.put(key, 0);
try {
return pjp.proceed();
} catch (Throwable throwable) {
logger.error("验证重复提交时出现未知异常!");
return RestResultGenerator.genErrorResult("验证重复提交时出现未知异常!");
} finally {
cache.invalidate(key);
} } }
package com.future.interceptor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @功能描述 防止重复提交标记注解
* @author Administrator
*
*/
@Target(ElementType.METHOD) // 作用到方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时有效
public @interface NoRepeatSubmit { }
package com.future.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder; @Configuration
public class UrlCache { @Bean
public Cache<String, Integer> getCache() {
// return CacheBuilder.newBuilder().expireAfterWrite(2L, TimeUnit.SECONDS).build();// 缓存有效期为2秒
return CacheBuilder.newBuilder().build();// 不设置缓存有效期
}
}
@RequestMapping(value = "/test", method = RequestMethod.POST)
@NoRepeatSubmit
public RestResult test() {
int res=6;
if(res>0){
return RestResultGenerator.genSuccessResult();
}
return RestResultGenerator.genErrorResult("核单失败");
}
 <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>24.0-jre</version>
</dependency>

来自:https://www.jianshu.com/p/09c6b05b670a

https://blog.csdn.net/memmsc/article/details/80837996 分布式参考

spring boot 重复提交的更多相关文章

  1. spring boot 开发 提交form表单出错

    提交表单时,字段有的没有值,springboot 会报错. org.springframework.validation.BindException: org.springframework.vali ...

  2. Spring boot POST 提交错误 Request header is too large

    解决方法 application.yml server: # 单位 KB max-http-header-size: 100000 java.lang.IllegalArgumentException ...

  3. spring boot 学习(七)小工具篇:表单重复提交

    注解 + 拦截器:解决表单重复提交 前言 学习 Spring Boot 中,我想将我在项目中添加几个我在 SpringMVC 框架中常用的工具类(主要都是涉及到 Spring AOP 部分知识).比如 ...

  4. Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  5. spring boot 防止重复提交

    服务器端实现方案:同一客户端在2秒内对同一URL的提交视为重复提交 上代码吧 pom.xml <?xml version="1.0" encoding="UTF-8 ...

  6. Spring Boot 如何防止重复提交?

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 在传统的web项目中,防止重复提交,通常做法是:后端生成一个唯一的提交令牌(uuid),并存储在服务端.页面提交请求携带这个 ...

  7. Spring MVC拦截器+注解方式实现防止表单重复提交

    原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过. 注,如果是集群的方式,则需要将token ...

  8. Spring MVC实现防止表单重复提交(转)

    Spring MVC拦截器+注解方式实现防止表单重复提交  

  9. Spring MVC防止数据重复提交

    现实开发中表单重复提交的例子很多,就包括手上这个门户的项目也有这种应用场景,用的次数多,但是总结,这还是第一次. 一.基本原理 使用token,给所有的url加一个拦截器,在拦截器里面用java的UU ...

随机推荐

  1. LInux文件基础知识和文件目录操作(二)文件I/O操作

    1.文件I/O操作分为两部分来讲解: 第一部分是非缓冲文件操作,这种操作适合于比较小规模文件的读写和对实时性要求很高的设备的数据通信,这类操作是系统调用提供的: 第二部分是缓冲文件操作,所面向的则是大 ...

  2. (52) C# 串口通讯

    一.串口通讯基本参数 1.波特率:每秒传输n个多少个二进制位. 例如 9600 b/s  = 1200 B/s=  1.172KB/S 2.传输数据格式 数据格式由起始位(start bit).数据位 ...

  3. ()centos7 安装python36

    centos7 默认安装 python2.7 1.先安装python36和对应pip yum install python-pip #安装python2的pip yum install python3 ...

  4. pycharm中evaluate expression的用法

    pycharm中evaluate expression的用法 首先要用debug调试模式运行程序,在代码编辑处右键debug,或着选择右上角的小虫子图标点击. 然后保证整个程序运行的时候可以中断,然后 ...

  5. QinQ 技术解析

    目录 1. 概述 2. QinQ 的产生背景 3. QinQ的作用及原理 4. QinQ 技术的优点 5. QinQ 的报文结构 6. QinQ的实现方式 (1) 基本QinQ (2) 灵活QinQ ...

  6. ffs, fls

    linux内核中的宏ffs(x)   linux内核中ffs(x)宏是平台相关的宏,在arm平台,该宏定义在 arch/arm/include/asm/bitops.h #define ffs(x) ...

  7. 2019牛客多校第二场A-Eddy Walker

    Eddy Walker 题目传送门 解题思路 因为走过所有的点就会停下来,又因为是从0出发的,所以当n>1时,在0停下来的概率为0,其他的为1/(n-1); 代码如下 #include < ...

  8. shell脚本批量监控主机磁盘信息

    写一个配置文件保存被监控主机SSH连接信息,格式:IP User Port [root@Test ~]# cat host 10.10.10.10 root 22 10.10.10.11 root 2 ...

  9. null == null 或者 [] == [] 或者{} == {} 或者alert(1|| 2) 或者alert(1&& 2) 结果及原理

    相信面试的小伙伴们都会遇到此头大的问题,是不是很想骂一句面试官:你白痴啊,鬼都用不着的东西拿来问,你还别说,这些看似用不着的东西却包含着最基础的原理,那我们来理一理. 1.alert(1||2)和 a ...

  10. java.sql.SQLException: ORA-64203: 目标缓冲区太小, 无法容纳字符集转换之后的 CLOB 数据

    <!--获取ae45at--> <select id="selectAe45at" parameterClass="java.util.Map" ...