我是靠谱客的博主 美满小鸭子,最近开发中收集的这篇文章主要介绍aop配合自定义的注解使用,使用RequestContextHolder静态类获取HttpServletRequest,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

先创建一个注解

package com.fchan.hashmapstudy.aspect;

public @interface CheckIng {
}

aop配置类

在需要aop切入的方法中加上这个注解就可以了

package com.fchan.hashmapstudy.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

@Aspect
@Component
public class CheckIngAspect {


    //注解的包名全路径
    @Around("@annotation(com.fchan.hashmapstudy.aspect.CheckIng)")
    public Object checkIng(ProceedingJoinPoint point) throws Throwable {
		//通过 RequestContextHolder 获取 HttpServletRequest
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
        HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();

        //从header中获取token
        String token = httpServletRequest.getHeader("x-toekn");

        //校验toekn,如果校验成功就执行方法,否则就抛异常出去,这里只是为了说明aop配合注解使用,就不多写了
        return point.proceed();
    }

}

在这里插入图片描述

通过RequestContextHolder静态类获取HttpServletRequest

//通过 RequestContextHolder 获取 HttpServletRequest
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();

通过在自定义注解内传入参数,配合aop做用户角色校验

定义一个可以传入自定义参数的注解,然后在aop中配置拦截

自定义注解中要注意参数的类型是有限制的。

  1. A primitive type—基本类型(java的八种基本类型:byte、short、int、long、float、double、char、boolean)

  2. String

  3. Class

  4. An enum type

  5. An annotation type

  6. An array type :类型为以上任一类型的数组

除了以上标示,其他类型编译都会出错: invalid type of annotation member。

package com.fchan.hashmapstudy.aspect;

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

@Retention(RetentionPolicy.RUNTIME)
// RetentionPolicy.RUNTIME 表示CheckUserRole这个注解在运行期可以用反射取到
public @interface CheckUserRole {
    String value();
}

aop中拦截使用该注解的方法,并且获取注解中配置的参数进行校验

private HttpServletRequest getHttpServletRequest() {
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
    return servletRequestAttributes.getRequest();
}


@Around("@annotation(com.fchan.hashmapstudy.aspect.CheckUserRole)")
public Object checkUserRole(ProceedingJoinPoint point) throws Throwable {
    //获取token
    HttpServletRequest httpServletRequest = getHttpServletRequest();
    String token = httpServletRequest.getHeader("x-token");
    //todo token有效期校验

    //获取请求里提交的role
    String requestRole = httpServletRequest.getHeader("role");

    //获取方法上的注解里的role值,比对看看是否相等,相等则符合要求
    MethodSignature signature = ((MethodSignature) point.getSignature());
    Method method = signature.getMethod();

    // 这里想通过反射获取 CheckUserRole 注解,需要在注解定义的地方加上 @Retention(RetentionPolicy.RUNTIME)
    CheckUserRole annotation = method.getAnnotation(CheckUserRole.class);
    String annotationRole = annotation.value();
    if(!Objects.equals(requestRole, annotationRole)){
        throw new SecurityException("用户无权访问");
    }
    return point.proceed();
}

使用该注解时传入的自定义参数
在这里插入图片描述

关于@Retention(RetentionPolicy.RUNTIME)相关的自定义注解可以参考
https://www.cnblogs.com/olmlo/p/3566778.html

最后

以上就是美满小鸭子为你收集整理的aop配合自定义的注解使用,使用RequestContextHolder静态类获取HttpServletRequest的全部内容,希望文章能够帮你解决aop配合自定义的注解使用,使用RequestContextHolder静态类获取HttpServletRequest所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部