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 分布式参考

最新文章

  1. 采用MVC模式JDBC演示案例
  2. eclipse下启动tomcat出现Setting property &#39;source&#39; to &#39;org.eclipse.jst.jee.server: &#39;错误的解决办法
  3. 【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验
  4. 关于tcpdump抓包一个很详细的介绍
  5. NFS配置项no_root_squash和root_squash的区别
  6. Runtime 、 Block
  7. C puzzles详解【34-37题】
  8. 浏览器打开应用指定的界面-b
  9. ORA-19573: cannot obtain exclusive enqueue for datafile 1
  10. [C++程序设计]基于对象的程序设计 基于对象的程序设计
  11. ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除
  12. js中关于两个变量的比较
  13. vue-router路由学习总结
  14. 携程apollo系列-客户端集成
  15. 读了这篇文章,你将变身web分析大师
  16. 大数据处理过程核心技术ETL详细介绍
  17. vue 静态资源 压缩提交自动化
  18. memcached 内存初始化与key-value存储
  19. ShareMemory
  20. Mac OS X运行程序出现bad interpreter: operation not permitted的解决方案

热门文章

  1. 在delphi中执行javascript代码
  2. 51nod 1149 Pi的递推式(组合数学)
  3. Python语法基础03(if语句,while循环与for循环)
  4. vue2.0使用基础
  5. Codeforces451A-Game With Sticks-思维
  6. USACO 2001 OPEN earthquake /// 最优比例生成树
  7. 第十篇 scrapy item loader机制
  8. 2019-7-15-WPF-测试触摸设备发送触摸按下和抬起不成对
  9. c++ const (转)
  10. 18_ShadowWalker