每次需要用户信息时候都要通过前端传递用户id,实现过于麻烦,且不安全,容易造成用户信息泄露,通过redis和cookie在后端保存用户信息
二、保存信息的实现1、用户登录时生成唯一标识ticket,并作为key保存在redis中
String ticket= UUID.randomUUID().toString().replace("-","");
String user_json= ObjectMapperUtil.toJSON(user);
RedisUtil.set(ticket,user_json);
2、将唯一标识的ticket作为value,保存在cookie中
Cookie cookie=new Cookie("TICKET",ticket);
cookie.setMaxAge(7*24*60*60);
cookie.setPath("/");
3、在客户端添加cookie
httpServletResponse.addCookie(cookie);注意
前端项目中若没有设置请求中可携带cookie一定要添加相关配置!!!!
试运行的时候后端明明写好了cookie但是前端本地存储中却没有相关信息,找了半天找到这个问题,在前端配置文件中添加
axios.defaults.withCredentials=true
得以解决
二、后端获取用户信息通过设置拦截器实现
每一次的请求通过拦截器判断是否登录,可添加放行请求(即不登陆也能通过的请求)
1、重写方法HandlerInterceptor类中方法判断是否登录
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Cookie cookie = CookieUtil.getCookieByName(request, TICKET);
if(cookie != null){ //不为null.则表示用户可能登录.
String ticket = cookie.getValue(); //cookie中存储的是Redis的key ticket密钥
if(RedisUtil.exists(ticket)){
//如果redis中的数据存在,则说明用户已经登录.可以放行请求.
//获取真实的用户信息
String userJSON = RedisUtil.get(ticket);
//将json转化为对象
UserInfo user = ObjectMapperUtil.toObject(userJSON, UserInfo.class);
request.setAttribute(USER, user);
return true;
}else{
//Cookie中的记录与Redis中的记录不一致.应该删除Cookie中的数据.
CookieUtil.deleteCookie(TICKET, "/",response);
}
}
2、配置拦截器
//注入拦截器
@Autowired
private UserInterCeptor userInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 放行路径
List patterns = new ArrayList();
patterns.add("/userInfo/login");
patterns.add("/userInfo/register");
patterns.add("/resultInfo/*");
registry.addInterceptor(userInterceptor).addPathPatterns("/**")
.excludePathPatterns(patterns);
}
后续可能还要添加放行路径,这个根据需求具体实现



