aop 幂等验证(二)
1 创建IIdempotent
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IIdempotent {
}
2 创建aop
@Component
@Aspect
public class IdempotentAction { public final static String ERROR_REPEATSUBMIT = "Repeated submission"; //redis
@Autowired
protected StringRedisTemplate idempotentTemplate; //配置接入点,如果不知道怎么配置,可以百度一下规则
@Pointcut("execution(* com.kps.webAPI*.controller..*.*(..))&&@annotation(com.kps.web.aop.Idempotent.IIdempotent)")
private void controllerAspect() {
} //成功处理请求
@AfterReturning("controllerAspect()")
public void AfterReturning(JoinPoint jp) throws Exception {
IdempotentCheck(jp, ComContants.OP_RESULT[1]);
} //后置异常通知
@AfterThrowing("controllerAspect()")
public void AfterThrowing(JoinPoint jp) throws Exception{
IdempotentCheck(jp,ComContants.OP_RESULT[2]);
} private void IdempotentCheck(JoinPoint jp, String opResult) throws Exception {
String controllerName = jp.getTarget().getClass().getName();
controllerName = controllerName.substring(controllerName.lastIndexOf(".") + 1);
Signature sig = jp.getSignature();
MethodSignature msig = (MethodSignature) sig;
// 获得被拦截的方法
Method method = msig.getMethod();
// webUI控制器 @Controller注解
IIdempotent systemlog = method.getAnnotation(IIdempotent.class);
HttpServletRequest request = WebUtil.getHttpServletRequest();
String body = NetUtil.getBodyString(request);
String signMD5= MD5.md5(body);
if (Boolean.parseBoolean(idempotentTemplate.opsForValue().get(signMD5))) {
throw new ErrorSignException(ERROR_REPEATSUBMIT);
} else {
idempotentTemplate.opsForValue().set(signMD5, "true", ComContants.IDEMPOTENT_EXTIME, TimeUnit.SECONDS);
} }
}
测试:
//幂等apo,测试实例,30秒不可重复提交相同数据
@IIdempotent
@RequestMapping(value = "test", method = RequestMethod.POST)
public ApiResult<String> test(@RequestBody ApiRequest<String> requestVO) {
ApiResult<String> r = new ApiResult<String>();
r.setData(requestVO.getData());
r.setCodeToSuccessed();
return r;
}
aop 幂等验证(二)的更多相关文章
- ASP.NET MVC Model验证(二)
ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...
- [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...
- [LeetCode] Validate Binary Search Tree 验证二叉搜索树
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- [CareerCup] 4.5 Validate Binary Search Tree 验证二叉搜索树
4.5 Implement a function to check if a binary tree is a binary search tree. LeetCode上的原题,请参见我之前的博客Va ...
- LeetCode(98): 验证二叉搜索树
Medium! 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...
- LeetCode第[98]题(Java):Validate Binary Search Tree(验证二叉搜索树)
题目:验证二叉搜索树 难度:Medium 题目内容: Given a binary tree, determine if it is a valid binary search tree (BST). ...
- LeetCode:验证二叉搜索树【98】
LeetCode:验证二叉搜索树[98] 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当 ...
- SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证
1 编程范式 1.1 面向过程 1.2 面向对象 1.3 面向切面编程 1.4 函数式编程 1.5 事件驱动编程 2 什么是面向切面编程 2.1 是一种编程范式,而不是一种编程语言 2.2 解决一些特 ...
- LeetCode初级算法--树02:验证二叉搜索树
LeetCode初级算法--树02:验证二叉搜索树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
随机推荐
- c# 抽象类,抽象方法使用(abstract)
入行一年多,在这个IT行业,开发技术主要使用的是.NET,而对应使用的高级语言自然就是c#了.从2017年7月入职后,在平时的工作过程中,只记得使用一些方法去完成逻辑功能,而很少去深究一些语法特性,特 ...
- DataTable增加行
- JavaScript学习一之数据校验
JavaScript页面进行数据校验 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- Apache2配置多域名站点及支持https
0x00 预备条件 申请SSL证书 建立对应站点目录 开放443端口 0x01 配置sites-available文件 执行 vi /etc/apache2/sites-available/zecoc ...
- pythonmysql运行报错解决过程中遇到的其中一个报错解决文章来源
本文章仅记录下面报错的解决文章来源:error: command 'C:\Users\Administrator\AppData\Local\Programs\Common\Micr osoft\Vi ...
- Netty中ByteBuf的引用计数线程安全的实现原理
原文链接 Netty中ByteBuf的引用计数线程安全的实现原理 代码仓库地址 ByteBuf 实现了ReferenceCounted 接口,实现了引用计数接口,该接口的retain(int) 方法为 ...
- MyDAL - .Where() & .And() & .Or() 使用
索引: 目录索引 一.API 列表 1.Where .Where(Func<M, bool> func) 如: .Where( it => (it.Prop1>=条件1 &am ...
- Java基础系列--04_数组
一维数组: (1)数组:存储同一种数据类型的多个元素的容器. (2)特点:每一个元素都有编号,从0开始,最大编号是数组的长度-1. 编号的专业叫法:索引 (3)定义格式 A:数据类型[] 数组名;(一 ...
- [LeetCode] 18. 四数之和
题目链接:https://leetcode-cn.com/problems/4sum/ 题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个 ...
- ReSharper2018破解详细方法
下载地址: 主程序官网下载链接:https://download.jetbrains.com/resharper/ReSharperUltimate.2018.3.3/JetBrains.ReShar ...