栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot使用AOP基于注解实现token拦截

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot使用AOP基于注解实现token拦截

往往在一些后台管理需求中,后台请求接口一般都需要token参数才能访问,下面介绍以下自定义@NeedToken注解使用切面aop技术决定请求接口是否需要token参数

目的

接口若有@NeedToken注解,若请求不携带token,则会抛出无token异常

接口若无该注解,不携带token,可正常请求该接口

思路 1.首先定义一个@NeedToken注解,作用于方法上
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NeedToken {
}
2.定义切面拦截

继承HandlerInterceptorAdapter类,重写preHandle方法,尝试分别从请求头,请求参数,cookie中获取token,若最后token为null,且需要token,则抛出无token,无权访问异常

@Component
public class LoginTokenInterceptor extends HandlerInterceptorAdapter {

    private static final String TOKEN_KEY = "token";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 判断访问的方法上是否有@needToken注解
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        boolean needToken = handlerMethod.hasMethodAnnotation(NeedToken.class);

        // 尝试从请求头从获取token
        String token = request.getHeader(TOKEN_KEY);
        if (StringUtils.isEmpty(token)) {
            // 尝试从请求参数中获取token
            token = request.getParameter(token);
        }

        if (StringUtils.isEmpty(token)) {
            // 尝试从cookie获取token
            if (request.getcookies() != null && request.getcookies().length != 0) {
                for (cookie cookie : request.getcookies()) {
                    if (TOKEN_KEY.equals(cookie.getName())) {
                        token = cookie.getValue();
                    }
                }

            }
        }

        // 若token为空,且需要token
        if (StringUtils.isEmpty(token)) {
            if (needToken) {
                throw new RuntimeException("无token,无权访问");
            }
        }

        return super.preHandle(request, response, handler);
    }
}
3.添加拦截器,将该拦截点放入拦截器
@Configuration
public class SpringMvcConfig extends WebMvcConfigurerAdapter {

    @Resource
    private LoginTokenInterceptor tokenInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        // 注册Token拦截器
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("
    @GetMapping("/test")
    @NeedToken
    public String test() {
        return "访问成功";
    }

    
    @GetMapping("/test1")
    public String test1() {
        return "访问成功";
    }
}
 5.测试结果

访问test接口,并不携带token,则出现

携带token后

总结

AOP在项目开发中真香,大家可自行测试

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/696481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号