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

在项目开发过程中,会有很多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@Referencepublic 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;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic 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");}}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挑战 ChatGPT 和 Google Bard 的防御

到目前为止&#xff0c;科学家已经创建了基于人工智能的聊天机器人&#xff0c;可以帮助内容生成。我们还看到人工智能被用来创建像 WormGPT 这样的恶意软件&#xff0c;尽管地下社区对此并不满意。但现在正在创建聊天机器人&#xff0c;可以使用生成人工智能通过即时注入活动来…

编程笔记 html5cssjs 014 网页布局框架

编程笔记 html5&css&js 014 网页布局框架 一、Bootstrap简介二、使用Bootstrap布局 网页布局不只用HTML&#xff0c;还要用CSS和JAVASCRIPT等技术完成,这里暂时简单了解一下Bootstrap。 一、Bootstrap简介 这是一个开源的前端框架&#xff0c;由Twitter的前端工程师Ma…

OpenHarmony之分布式软总线

背景概述 从之前的文档(OpenHarmony之内核层)可知 分布式软总线是多设备终端的统一基座&#xff0c;为设备间的无缝互联提供了统一的分布式通信能力&#xff0c;能够快速发现并连接设备&#xff0c;高效地传输任务和数据。 分布式软总线实现近场设备间统一的分布式通信管理能…

代码随想录刷题第三十四天| 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

代码随想录刷题第三十四天 K次取反后最大化的数组和 (LC 1005) 题目思路&#xff1a; 代码实现&#xff1a; class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:nums.sort(keylambda x: abs(x), reverseTrue)for i in range(len(nums…

Mongodb聚合操作$isNumber

又是mongodb集合的不强制文档具有相同一致的结构产生的问题。Mongodb这种特点&#xff0c;确实带来了灵活强大的优势&#xff0c;但Mongodb的一些操作符和特性看起来在为这种灵活的结构买单。 这次有两个问题。某一个气温监控系统&#xff0c;采用了不同的传感器厂家生产的系统…

8868体育助力意甲罗马俱乐部 迪巴拉有望付出

8868体育助力意甲罗马俱乐部 迪巴拉有望付出 意甲罗马俱乐部是8868体育合作球队之一&#xff0c;本赛季&#xff0c;在意甲第14轮的比赛中&#xff0c;罗马客场2-1战胜萨索洛&#xff0c;积分上升到意甲第4位。 有报道称&#xff0c;迪巴拉在对阵佛罗伦萨的比赛中受伤&#xff…

sql中date查询优化

SQL日期查询的优化通常涉及到使用适当的日期函数、避免不必要的日期格式转换以及确保查询条件的合理化。以下是一些针对日期查询的常见优化策略&#xff1a; 1. 使用合适的日期函数 使用数据库提供的日期函数&#xff0c;如 DATE(), NOW(), CURDATE(), DAY(), MONTH(), YEAR(…

网络Ping不通故障定位思路

故障分析 Ping不通是指Ping报文在网络中传输&#xff0c;由于各种原因&#xff08;如链路故障、ARP学习失败等&#xff09;而接收不到所有Ping应答报文的现象。 如图1-1所示&#xff0c;以一个Ping不通的尝试示例&#xff0c;介绍Ping不通故障的定位思路。 图1-1 Ping不通故…

在机器学习训练测试集中,如何切分出一份验证集

文章目录 1.读取数据&#xff1a;2.绘图查看target数量情况&#xff1a;3.特征拓展&#xff1a;4.构建X&#xff0c;y&#xff1a;5.拆分训练集和测试集&#xff0c;特征做缩放处理&#xff1a;6.从训练集里再切一次出验证集&#xff0c;特征做缩放处理&#xff1a;7.测试集训练…

Shell基本命令 Mkdir创建 cp 复制 ls-R递归打印 文件权限

mkdir 是在命令行界面下创建目录&#xff08;文件夹&#xff09;的命令。它是 “make directory” 的缩写。 以下是 mkdir 命令的基本语法&#xff1a; mkdir 目录路径其中&#xff0c;目录路径 是要创建的目录的路径和名称。 例如&#xff0c;要在当前目录下创建一个名为 m…

Java介绍

Java 是一门纯粹的面向对象编程语言&#xff0c;它吸收了C的各种优点&#xff0c;还努力摒弃了C里难以理解的多继承、指针等概念&#xff0c;真正地实现了面向对象理论&#xff0c;因而具有功能强大和简单易用两个特征。 除了基础语法之外&#xff0c;Java还有许多必须弄懂的特…

OpenCV-Python(22):直方图的计算绘制与分析

目标 了解直方图的原理及应用使用OpenCV 或Numpy 函数计算直方图使用Opencv 或者Matplotlib 函数绘制直方图学习函数cv2.calcHist()、np.histogram()等 原理及应用 直方图是一种统计图形&#xff0c;是对图像的另一种解释&#xff0c;用于表示图像中各个像素值的频次分布。直…

Linux驱动开发之杂项设备注册和Linux2.6设备注册

目录 一、杂项设备注册 杂项设备注册简介 杂项设备注册特点: 杂项设备注册相关API misc_register() misc_deregister() 杂项设备注册相关例程 例程简介 源码分享 二、Linux 2.6设备注册 Linux2.6设备注册简介 Linux 2.6设备注册特点 Linux2.6设备注册流程 ​Linu…

sklearn 中matplotlib编制图表

代码 # 导入pandas库&#xff0c;并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件&#xff0c;将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…

人机交互中信息数量与质量

在人机交互中&#xff0c;信息的数量和质量都是非常重要的因素。 信息的数量指的是交互过程中传递的信息的多少。信息的数量直接影响到交互的效率和效果&#xff0c;如果交互中传递的信息量太少&#xff0c;可能导致交互过程中的信息不足&#xff0c;用户无法得到想要的结果或者…

三菱人机交互GT Designer的使用(二,开关,指示灯,数值显示,数值输入)

今天也开始每日一学&#xff0c;内容为开关&#xff0c;指示灯&#xff0c;数值显示&#xff0c;数值输入&#xff0c;以为这篇文章比较长&#xff0c;所有小编决分为3篇内容写完&#xff0c;谢谢大家阅读&#xff0c;不足之处&#xff0c;欢迎指正。 目录 开关 位&#xff0c…

【UE5蓝图】读取本地json文件修改窗口大小

效果 插件 蓝图 1.判断文件存在 2.1文件不存在&#xff0c;生成文件 {"ResolutionX":540, "ResolutionY":960} 2.2文件存在&#xff0c;直接读取 3.设置窗口大小 遇到的坑 1.分辨率太大&#xff0c;导致效果不理想&#xff0c;建议先往小填写。 2.选对…

JSON 详解

文章目录 JSON 的由来JSON 的基本语法JSON 的序列化简单使用stringify 方法之 replacerstringify 方法之 replacer 参数传入回调函数stringify 方法之 spacestringify 方法之 toJSONparse 方法之 reviver 利用 stringify 和 parse 实现深拷贝 json 相信大家一定耳熟能详&#x…

React Hooks 面试题 | 08.精选React Hooks面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法

一、最终效果 二、步骤 1、在初始化进入项目时&#xff0c;获取当前主题色 2、把主题色定义成全局变量&#xff08;即在app.js中设置&#xff09; 3、tabBar也需要定义全局变量&#xff0c;在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…