利用SpringAOP和注解编程配置全局权限校验

admin 37 0
/**
 * @Classname TokenAop
 * @Description TODO
 * @Date 2021/5/7 0:41
 * @Created by JiGuang
 */
@Component
@Aspect
@Slf4j
public class TokenAop {
    @Resource
    TokenService tokenService;

    //指定包名
    @Pointcut("execution(* cc.coolplay51.fakashop3.Controller..*.*(..))")
    public void doHandler(){

    }

    @Around("doHandler()")
    public Object exception(ProceedingJoinPoint joinPoint){
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();

        //得到要进入的是哪个controller方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        Class clazz = signature.getMethod().getDeclaringClass();

        if(method.isAnnotationPresent(RequireToken.class) || clazz.isAnnotationPresent(RequireToken.class)){
            //获取到Token
            String token = request.getHeader("Authorization");
            //token存在判断
            if(Objects.isNull(token) || "".equals(token)){
                return MsgUtil.fail("请登录后再操作",-2);
            }
            //token有效性判断
            Msg result = tokenService.getQQByToken(token);
            if(result.getCode() < 0){
                return MsgUtil.fail("您的登录无效,请重新登录",-3);
            }
        }
        //执行方法
        try {
            Object result = joinPoint.proceed(joinPoint.getArgs());
            return result;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return MsgUtil.fail("系统错误");
        }

    }

}

上面代码完成了对全局Controller的切面编程,获取方法和类上面是不是有自定义的某些检查注解,有的话就执行对应的逻辑。

自定义注解代码如下:

package cc.coolplay51.fakashop3.Handler;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Classname RequireToken
 * @Description TODO
 * @Date 2020/11/19 23:57
 * @Created by JiGuang
 */
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireToken {

}


简单粗暴又好用噢


在Service层需要拿到用户登录的信息,但是用Controller层传参又不优雅,于是再写一个工具类用于获取用户信息的

(当然,通过Service层注入 HttpServletRequest 也可以实现,只是比较low)


/**
 * @Classname TokenUtil
 * @Description TODO
 * @Date 2021/5/7 1:01
 * @Created by JiGuang
 */public class TokenUtil {
     @Resource
     static
     TokenService t;
    /**
     * 在Service层获取Token
     * @return
     */
     public static String getToken(){
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                 .getRequest();
         String token = request.getHeader("Authorization");
         return token;
     }

    /**
     * 获取用户信息
     * @return 用户信息
     */
     public static Msg getUser(){
         return t.getQQByToken(getToken());
     }
}


发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~