个人博客项目笔记_04
1|01. 注册
1|11.1 接口说明
接口url:/register
请求方式:POST
请求参数:
参数名称 | 参数类型 | 说明 |
---|---|---|
account | string | 账号 |
password | string | 密码 |
nickname | string | 昵称 |
返回数据:
1|21.2 Controller
参数LoginParam类中 添加新的参数nickname。
1|31.3 Service
redisTemplate.opsForValue().set("TOKEN_"+token, JSON.toJSONString(sysUser), 1, TimeUnit.DAYS);
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
key
: Redis 中的键值,这里是以 "TOKEN_" 开头加上用户的 token。value
: 要存储的值,这里是用户信息对象sysUser
转换成的 JSON 字符串,使用了JSON.toJSONString()
方法。timeout
: 过期时间,这里设置为 1。timeUnit
: 过期时间单位,这里设置为TimeUnit.DAYS
,表示一天。这段代码的作用是将用户信息存入 Redis 中,并设置了一天的过期时间。通常这样做是为了实现用户登录状态的持久化,以及实现一定的缓存机制。
1|41.4 加事务
当然 一般建议加在 接口上,通用一些。
测试的时候 可以将redis 停掉,那么redis连接异常后,新添加的用户 应该执行回滚操作。
1|51.5 测试
2|02. 登录拦截器
每次访问需要登录的资源的时候,都需要在代码中进行判断,一旦登录的逻辑有所改变,代码都得进行变动,非常不合适。
那么可不可以统一进行登录判断呢?
可以,使用拦截器,进行登录拦截,如果遇到需要登录才能访问的接口,如果未登录,拦截器直接返回,并跳转登录页面。
2|12.1 拦截器实现
public class LoginInterceptor implements HandlerInterceptor
:
LoginInterceptor
类实现了HandlerInterceptor
接口,拦截请求并在进入 Controller 方法之前进行处理。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
:这是拦截器中的
preHandle
方法,用于在请求到达 Controller 方法之前进行处理。让我解释这个方法的参数和作用:
Object handler
: 表示被拦截的处理器对象,通常是一个 Controller 方法。在这个方法中,我们可以对请求进行拦截、处理和转发。boolean
: 方法的返回类型为布尔值,用于指示是否允许请求继续执行。如果返回true
,则请求将继续执行后续的拦截器或进入 Controller 方法;如果返回false
,则请求将被拦截,不会继续执行后续的拦截器或进入 Controller 方法。
这段代码用于检查
handler
是否为HandlerMethod
的实例,如果不是,则认为是请求静态资源,直接放行。
HandlerMethod
是 Spring MVC 中用于处理请求的处理器方法的封装类。通常情况下,Controller 中的方法会被包装成HandlerMethod
实例。RequestResourceHandler
是 Spring Boot 默认用于处理静态资源的处理器。当请求的路径匹配到静态资源时,会由RequestResourceHandler
处理。因此,这段代码的逻辑是:如果
handler
不是HandlerMethod
的实例,即不是 Controller 中的处理器方法,则认为是请求静态资源,直接放行,不进行拦截处理。
2|22.2 使拦截器生效
2|32.3 测试
3|03. ThreadLocal保存用户信息
ThreadLocal 是 Java 提供的一个线程局部变量类,它允许我们在每个线程中存储和获取各自的值,而不会被其他线程共享。每个线程都拥有自己独立的 ThreadLocal 实例,可以在其中存储数据,这些数据对其他线程是不可见的。
ThreadLocal 的主要特点包括:
- 线程隔离:每个线程都拥有自己独立的 ThreadLocal 对象实例,通过该实例可以存储和获取线程私有的数据。
- 数据共享:在同一个线程内部,ThreadLocal 可以在多个方法之间共享数据,而不需要通过参数传递或全局变量。
- 线程安全:由于每个线程拥有自己的 ThreadLocal 实例,因此对 ThreadLocal 的操作是线程安全的,不会受到其他线程的干扰。
- 高效性:ThreadLocal 使用线程的 ThreadLocalMap 存储数据,底层是一个数组结构,查找速度快,不会引起线程间的竞争。
ThreadLocal 的常见用途包括:
- 保存用户上下文信息:可以在 Web 请求处理过程中将用户信息存储在 ThreadLocal 中,便于后续的业务处理方法获取用户信息,而不必每次都去查询数据库。
- 避免参数传递:可以在同一个线程的不同方法之间共享数据,避免参数传递的复杂性。
- 线程安全的日期格式化:可以使用 ThreadLocal 存储日期格式化对象,确保在多线程环境下的安全使用。
需要注意的是,由于 ThreadLocal 是与线程绑定的,因此在使用完 ThreadLocal 后需要及时清理,以避免内存泄漏。通常在线程结束时,或在合适的时机调用
remove()
方法进行清理。
定义了一个
UserThreadLocal
类,用于在当前线程中存储和获取用户信息。
private static final ThreadLocal<SysUser> LOCAL = new ThreadLocal<>();
:声明一个
ThreadLocal
对象,用于保存用户信息。ThreadLocal
是一个线程局部变量,可以在每个线程中存储各自的值,而不会被其他线程共享。
public static void put(SysUser sysUser)
: 将传入的sysUser
对象存储在当前线程的ThreadLocal
中。
public static SysUser get()
: 从当前线程的ThreadLocal
中获取存储的SysUser
对象。
public static void remove()
: 从当前线程的ThreadLocal
中移除存储的SysUser
对象。
__EOF__

本文链接:https://www.cnblogs.com/zyj3955/p/18127290.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-04-10 关于ECharts图表反复修改都无法显示的解决方案