package com.czq.aop;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.czq.constant.ConstantUtils;
import com.czq.ext.ExtApiIdempotent;
import com.czq.ext.ExtApiToken;
import com.czq.utils.TokenRedis;
/**
* @author chenzhiqiang
* @date 2018年7月28日
* @Description: (防止接口重复提交幂等性问题)
* @version V1.0
*/
@Aspect
@Component
public class ExtApiAopIdempotent {
@Autowired
private TokenRedis tokenRedis;
/**
* 使用AOP环绕通知拦截所有访问(controller)
*/
@Pointcut("execution(public * com.czq.controller.*.*(..))")
public void rlAop(){
}
/**
* 前置通知
* 在方法执行前自动生成token
* @param point
*/
@Before("rlAop()")
public void before(JoinPoint point){
MethodSignature signature = (MethodSignature) point.getSignature();
ExtApiToken extApiToken = signature.getMethod().getAnnotation(ExtApiToken.class);
if(extApiToken != null){
getRequest().setAttribute("token", tokenRedis.getToken());
}
}
/**
* 环绕通知
* @return
*/
@Around("rlAop()")
public Object doBefore(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
//判断方法上是否有加ExtApiIdempotent
MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
ExtApiIdempotent declaredAnnotation = methodSignature.getMethod().getAnnotation(ExtApiIdempotent.class);
if(declaredAnnotation != null){
String type = declaredAnnotation.type();
//使用token解决幂等性问题
//步骤
String token = null;
HttpServletRequest request = getRequest();
if(type.equals(ConstantUtils.EXTAPIHEAD)){
token = getRequest().getHeader("token");
}else{
token = request.getParameter("token");
}
if(StringUtils.isEmpty(token)){
return "参数错误";
}
//接口获取对应的令牌,如果能够从redis获取令牌 将该令牌删除
boolean isToken = tokenRedis.findToken(token);
if(!isToken){
response("请勿重复提交!");
//后面方法不再执行
return null;
}
}
//放行
Object proceed = proceedingJoinPoint.proceed();
return proceed;
}
public HttpServletRequest getRequest(){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
return request;
}
public void response(String msg)throws IOException{
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = attributes.getResponse();
response.setHeader("Content-type", "text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
try {
writer.println(msg);
} catch (Exception e) {
}finally{
writer.close();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
springboot_idempotent.zip (32个子文件)
springboot_idempotent
.project 573B
src
test
resources
java
main
resources
application.properties 536B
java
com
czq
service
impl
UserServiceImpl.java 579B
UserService.java 182B
utils
TokenRedis.java 1KB
aop
ExtApiAopIdempotent.java 4KB
constant
ConstantUtils.java 156B
controller
UserController.java 2KB
base
BaseRedisService.java 1KB
mapper
UserMapper.java 501B
SpringBootApp.java 406B
ext
ExtApiIdempotent.java 531B
ExtApiToken.java 496B
bean
UserEntity.java 446B
target
classes
application.properties 536B
com
czq
service
UserService.class 236B
impl
UserServiceImpl.class 937B
utils
TokenRedis.class 1KB
aop
ExtApiAopIdempotent.class 4KB
constant
ConstantUtils.class 239B
SpringBootApp.class 769B
controller
UserController.class 2KB
base
BaseRedisService.class 2KB
mapper
UserMapper.class 648B
ext
ExtApiToken.class 387B
ExtApiIdempotent.class 435B
bean
UserEntity.class 957B
test-classes
.settings
org.eclipse.m2e.core.prefs 90B
org.eclipse.jdt.core.prefs 243B
org.eclipse.core.resources.prefs 191B
pom.xml 2KB
.classpath 1KB
共 32 条
- 1
资源评论
橙子墙
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功