Springboot自定义注解拦截用户登录

自定义注解很简单,无非就是了解几个元注解,元注解都在java.lang.annotation包:

  • @Target
  • @Retention
  • @Documented
  • @Inherited

常用的就以上四个,下面写的详细点:

  • @Target
    • 描述注解的使用范围(可以修饰什么地方)

可传入类型:

public enum ElementType {
 
    TYPE, // 类、接口、枚举类
 
    FIELD, // 成员变量(包括:枚举常量)
 
    METHOD, // 成员方法
 
    PARAMETER, // 方法参数
 
    CONSTRUCTOR, // 构造方法
 
    LOCAL_VARIABLE, // 局部变量
 
    ANNOTATION_TYPE, // 注解类
 
    PACKAGE, // 可用于修饰:包
 
    TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
 
    TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
}

  • @Retention
    • 描述注解保留的时间范围(被描述的注解在它所修饰的类中可以被保留到何时),共有三种策略。

可传入类型:

public enum RetentionPolicy {
    SOURCE,    // 源文件保留
    CLASS,       // 编译期保留,默认值
    RUNTIME   // 运行期保留,可通过反射去获取注解信息
}
  • @Documented
    • 描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
  • @Inherited
    • 使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。

使用注解拦截用户信息Demo代码:

LoginRequired注解:

import java.lang.annotation.*;

@Inherited
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {

    boolean required() default false;

}

LoginInterceptor拦截器:

public class LoginInterceptor implements HandlerInterceptor {

    private static final Logger log = LoggerFactory.getLogger(LoginInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.判断是否存在注解
        if (!(handler instanceof HandlerMethod)) {
            log.info("不是HandlerMethod类型,则无需检查");
            return true;
        }
        HandlerMethod method = (HandlerMethod) handler;
        boolean hasLoginAnnotation = method.getMethod().isAnnotationPresent(LoginRequired.class);
        if (!hasLoginAnnotation) {
            //不存在LoginRequired注解,则直接通过
            log.info("不存在LoginRequired注解,则直接通过");
            return true;
        }
        LoginRequired loginRequired = method.getMethod().getAnnotation(LoginRequired.class);
        //2.required=false,则无需检查是否登录
        if (!loginRequired.required()) {
            log.info("required=false,则无需检查是否登录");
            return true;
        }
        //3.登录状态检查,使用response返回指定信息
        log.info("required=true,需检查是否登录");
        response.getWriter().append("you need login!");
        return false;
    }
}

LoginConfiguration配置拦截器:

/**
 * 配置拦截器
 */
@Configuration
public class LoginConfiguration implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor());
    }
}

测试Controller:

@Controller("/")
@ResponseBody
public class IndexController {

    @LoginRequired()
    @GetMapping("/ok")
    public String index(){
        return "ok";
    }

    @LoginRequired(required = true)
    @GetMapping("/fail")
    public String fail(){
        return "fail";
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素人岳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值