token的登陆校验小结
程序员文章站
2022-04-18 09:31:28
...
关于token做登陆拦截的思路整理:
使用到的技术:token,redis,jackson
maven加载token
编写token的生成和解析静态工具类
登陆步骤:
前端发送登录请求之后
-> 验证登陆成功
-> 把验证查找到的用户信息使用jackson转为字符串
-> 以生成的uuid为key,用户字符串为value储存在redis中
-> 给前端返回生成的token -> 前端储存到本地 验证步骤: 前端每次发送请求都要携带之前储存 在本地的token(方法见AXIOS统一文档) 存在请求头中发送到后端
-> 后端配置拦截器,拦截除登陆,首页,获取验证的其他请求
-> (此时会出现一个问题:我们只能在拦截器中获取请求头中的token,如果想要在其他方法中获取, 需要每个方法中写入HttpServletRquest,太麻烦,我们需要一个工具类, 可以随时获取全局的HttpServletRquest,以便于我们解析其中携带的请求头中的token)
package com.sm.qy28.contorller.lanjieqi;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
public class SevletUtils {
/**
* 获取全局的Request
* @return
*/
public static HttpServletRequest getRequest(){
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
return servletRequestAttributes.getRequest();
}
}
编写解析token静态方法,获取Rquest中请求头中携带的token,解析出uuid,再用UUid为key查询 Redis中储存的用户信息字符串 -> 查询成功就代表为登录状态 如果查询不成功,或解析就不成功,不应该在拦截器中返回false,而是应该抛出异常,并处理
此时,如果抛了异常,前端就会出现跨域问题,因为如果抛异常,那么你在spring里配置的跨域处理cores就没有作用,因为我们自定义的拦截器会在cores过滤器之前执行,如果我们的拦截器直接抛异常,那么就不会进入cores过滤器,自然就不会处理跨域问题,解决方案见跨域处理