栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

前后端分离项目springboot+redis+cookie在后端保存用户信息

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

前后端分离项目springboot+redis+cookie在后端保存用户信息

一、前述

每次需要用户信息时候都要通过前端传递用户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);
    }

后续可能还要添加放行路径,这个根据需求具体实现

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/943471.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号