spring boot 重复提交
2024-09-06 06:49:06
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 分布式参考
最新文章
- 采用MVC模式JDBC演示案例
- eclipse下启动tomcat出现Setting property &#39;source&#39; to &#39;org.eclipse.jst.jee.server: &#39;错误的解决办法
- 【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验
- 关于tcpdump抓包一个很详细的介绍
- NFS配置项no_root_squash和root_squash的区别
- Runtime 、 Block
- C puzzles详解【34-37题】
- 浏览器打开应用指定的界面-b
- ORA-19573: cannot obtain exclusive enqueue for datafile 1
- [C++程序设计]基于对象的程序设计 基于对象的程序设计
- ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除
- js中关于两个变量的比较
- vue-router路由学习总结
- 携程apollo系列-客户端集成
- 读了这篇文章,你将变身web分析大师
- 大数据处理过程核心技术ETL详细介绍
- vue 静态资源 压缩提交自动化
- memcached 内存初始化与key-value存储
- ShareMemory
- Mac OS X运行程序出现bad interpreter: operation not permitted的解决方案
热门文章
- 在delphi中执行javascript代码
- 51nod 1149 Pi的递推式(组合数学)
- Python语法基础03(if语句,while循环与for循环)
- vue2.0使用基础
- Codeforces451A-Game With Sticks-思维
- USACO 2001 OPEN earthquake /// 最优比例生成树
- 第十篇 scrapy item loader机制
- 2019-7-15-WPF-测试触摸设备发送触摸按下和抬起不成对
- c++ const (转)
- 18_ShadowWalker