博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用redis实现分布式请求防重复提交
阅读量:5991 次
发布时间:2019-06-20

本文共 2661 字,大约阅读时间需要 8 分钟。

hot3.png

1.自定义注解类Token

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Token {    String flag() default "";}

2.在需要拦截的路径上加自定义注解

@Token@RequestMapping(value = "/pda/pick-task/list")public RespJson getPickTask(@RequestParam("whNo") String whNo,                            @RequestParam(value = "sourceType", required = false) Integer sourceType,                            @RequestParam(value = "retrieveValue", required = false) String retrieveValue,                            @RequestParam(value = "realTimePick", required = false, defaultValue = "0") int realTimePick,                            @RequestParam(value = "taskGroupNo", required = false) String taskGroupNo) {...

3.利用切面拦截请求

@Aspect@Componentpublic class MethodInterceptor {    private Logger logger = LoggerFactory.getLogger(MethodInterceptor.class);
/** * 重复请求拦截 * * @param joinPoint * @return * @throws Throwable */@Around("@annotation(com.haiziwang.kwms.common.annotation.Token)")public Object repeatRequestAround(ProceedingJoinPoint joinPoint) throws Throwable {    MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();    Method currentMethod = joinPoint.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());    IKMEMCache cache = KMemServiceImpl.getCache();    //拼接签名    StringBuilder signBuffer = new StringBuilder(currentMethod.getAnnotation(RequestMapping.class).value()[0]);    Object[] args = joinPoint.getArgs();    for (Object object : args) {        if (object != null) {            String str = "";            try {                str = JSONObject.toJSONString(object);            } catch (Exception e) {            }            signBuffer.append("^").append(str);        }    }    String tokenKey = signBuffer.toString();    if (StringUtils.isNotBlank(cache.readFromHash(RedisKeyType.TOKEN.getName(), tokenKey))) {        if (StringConstants.WCS.equals(currentMethod.getAnnotation(Token.class).flag())) {            throw new WMS3CheckedException(WMS3ExceptionCode.WCS_REPEAT_REQUEST_EXCEPTION);        }        if (currentMethod.getReturnType() == RespJson.class) {            throw new WMS3CheckedException(WMS3ExceptionCode.REPEAT_REQUEST_EXCEPTION);        }        if (currentMethod.getReturnType() == PageRespJson.class) {            throw new WMS3CheckedException(WMS3ExceptionCode.REPEAT_REQUEST_PAGE_EXCEPTION);        }    }    cache.write4Hash(RedisKeyType.TOKEN.getName(), tokenKey, "token");    try {        return joinPoint.proceed();    } finally {        cache.deleteHashFields(RedisKeyType.TOKEN.getName(), tokenKey);    }}

 

转载于:https://my.oschina.net/u/2485283/blog/1859323

你可能感兴趣的文章
记一次内网渗透检测
查看>>
开发过程中得错误
查看>>
【坑】 MySQL中,字符串和数值的比较
查看>>
我的友情链接
查看>>
secure crt vim颜色显示
查看>>
VMware ESXi 5.0安装图文教程
查看>>
头文件的2种方式与枚举的优势
查看>>
了解锁及上锁时长
查看>>
python request
查看>>
【基础】ARP协议-交换机工作原理-及广播风暴问题分析
查看>>
远程桌面管理服务器报“没有终端服务器客户端访问许可证”的解决方法
查看>>
我的友情链接
查看>>
ASA防火墙静态PAT端口范围测试
查看>>
我的友情链接
查看>>
掌握11项技能,你就是优秀的前端开发工程师
查看>>
Sublime Text2 搭建Java开发环境
查看>>
zookeeper之监听事件总结
查看>>
判断当前字符是单字节还是双字节
查看>>
CSS使页面变灰(用于哀悼)
查看>>
Hibernate 与mybatis的区别
查看>>