详解SpringBoot如何优雅的处理免登录接口

 更新时间:2024年01月02日 09:32:12   作者:RoronoaV587  
在项目开发过程中,会有很多API接口不需要登录就能直接访问,比如公开数据查询之类的,常规处理方法基本是 使用拦截器或过滤器,拦截需要认证的请求路径,本文介绍一个更优雅的方法自定义注解的方式,文中通过代码示例介绍的非常详细,需要的朋友可以参考下

在项目开发过程中,会有很多API接口不需要登录就能直接访问,比如公开数据查询之类的 ~

常规处理方法基本是 使用拦截器或过滤器,拦截需要认证的请求路径。在拦截器中判断session或token信息,如果存在则放行,否则跳转到登录页。过滤器原理与拦截器类似,可以在过滤器中判断请求的session或token信息,麻烦的地方就是:每次开发新的免登录接口的时候,都需要去配置一下路径

今天介绍一个更优雅的方法:自定义注解的方式

基本思路是:自定义一个注解,在不需要校验登录的Controller方法或类上使用该注解。通过AOP或拦截器在方法执行前判断免登录状态

自定义注解这里命名为NoToken

import java.lang.annotation.*;
 
/**
 * 不校验token注解
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NoToken {
    String name() default "";
}

这里采用拦截器搭配使用,拦截器代码如下

@Slf4j
public class SessionInterceptor implements HandlerInterceptor {
 
    //在请求处理之前进行调用Controller方法调用之前
    @Override
    @Reference
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            NoToken classAnno = handlerMethod.getMethod().getDeclaringClass().getAnnotation(NoToken.class);
            //获取出Controller上的NoToken注解
            if (classAnno != null) {
                // 如果注解不为null, 说明不需要拦截, 直接放过
                return true;
            } else {
                Method method = handlerMethod.getMethod();
                handlerMethod.getMethodAnnotation(NoToken.class);
                //获取出方法上的NoToken注解
                NoToken access = method.getAnnotation(NoToken.class);
                if (access != null) {
                    // 如果注解不为null, 说明不需要拦截, 直接放过
                    return true;
                }
            }
        }
 
        RedisService redis = (RedisService) SpringContextUtils.getBean("redisService");
        String token = request.getHeader("token");
 
 
        boolean ok = false;
        log.info("开始检验token!");
        if (!StringUtils.isEmpty(token)) {
            if (redis.exists(token)) {
                redis.expire(token, ConstantsUtil.APP_TOKEN_EXPIRE);
                log.info("token有效!");
                ok = true;
            }
        }
 
 
        if (!ok) {
            Map<String, Object> result = new HashMap<>();
            result.put("returncode","-1");
            result.put("returnmsg", "登录已过期,请重新登录");
            writeJSON(response, result);
            return ok;
        }
        return ok;
 
    }
 
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) throws Exception {
 
    }
    public void writeJSON(HttpServletResponse response, Object o)
            throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String JsonString = JSON.toJSONString(o);
        out.write(JsonString);
    }
}

大家看到在NoToken注解和拦截器上,做了两种处理 也就是类注解 和 方法注解

如果注解放到方法上,该方法调用的时候就是免登录的。如果注解放到@Controller类上,那么该类下的所有请求接口,都是免登录的(是不是很方便 ~)

/**
 * 类上加NoToken注解,该类下所有方法都免登录
 */
@NoToken
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
 
 
    /**
     * 方法上单独加注解,只对该方法免登录
     */
    @NoToken
    @RequestMapping("testMethod")
    public void testMethod() {
        System.out.println("1111111111111");
    }
 
 
}

以上就是实现方式,如果觉得还有用,就点个赞吧 ~

到此这篇关于详解SpringBoot如何优雅的处理免登录接口的文章就介绍到这了,更多相关SpringBoot处理免登录接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVALambda表达式与函数式接口详解

    JAVALambda表达式与函数式接口详解

    大家好,本篇文章主要讲的是JAVALambda表达式与函数式接口详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 如何获取所有spring管理的bean

    如何获取所有spring管理的bean

    这篇文章主要介绍了如何获取所有spring管理的bean,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot注入Bean的四种方式总结

    SpringBoot注入Bean的四种方式总结

    这篇文章主要给大家总结SpringBoot注入Bean的四种方式,启动类注入Bean,启动类扫描@ComponentScan,启动类@EnableConfigurationProperties以及启动类@Import这四种方式,文章通过代码示例讲解非常详细,需要的朋友可以参考下
    2023-11-11
  • Spring Initializr中生成的mvnw有什么用

    Spring Initializr中生成的mvnw有什么用

    这篇文章主要介绍了Spring Initializr中生成的mvnw有什么用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Mybatis-Plus设置全局或者局部ID自增的实现

    Mybatis-Plus设置全局或者局部ID自增的实现

    在使用Mybatis-Plus新增的时候,我们往往想要id随着数据库自增,本文主要介绍了Mybatis-Plus设置全局或者局部ID自增的实现,具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • spring配置文件加密方法示例

    spring配置文件加密方法示例

    这篇文章主要介绍了spring配置文件加密方法示例,简单介绍了什么是配置文件,然后分享了在实际生产环境中,对配置文件不允许出现明文用户名及密码等信息需求的Java实现代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java isInterrupted()判断线程的实例讲解

    java isInterrupted()判断线程的实例讲解

    在本篇内容里小编给大家分享的是一篇关于java isInterrupted()判断线程的实例讲解内容,有兴趣的朋友们可以学习下。
    2021-05-05
  • 基于Spring Boot 排除自动配置的4个方法

    基于Spring Boot 排除自动配置的4个方法

    这篇文章主要介绍了Spring Boot 排除自动配置的4个方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中RabbitMQ延迟队列实现详解

    Java中RabbitMQ延迟队列实现详解

    这篇文章主要介绍了Java中RabbitMQ延迟队列实现详解,消息过期后,根据routing-key的不同,又会被死信交换机路由到不同的死信队列中,消费者只需要监听对应的死信队列进行消费即可,需要的朋友可以参考下
    2023-09-09
  • Java之操作Redis案例讲解

    Java之操作Redis案例讲解

    这篇文章主要介绍了Java之操作Redis案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论