• SpringBoot中使用cookie和Session实现七天免密登录


    1、是什么?

    • cookie存储在客户端的浏览器内存或者硬盘上;Session存储在服务端的内存中。

    2、解决了什么问题?

    • 解决http的无状态性;比如我想实现网上商城购物车功能,保存每个客户端用户登录信息的?七天记住密码功能;用户登录信息续签功能。

    3、怎么用?

    • 我大概给个流程图
      流程图

    4、代码实现

    4.1、给客户端生成对应的Session,并返回Cookie到浏览器

        @RequestMapping("/source")
        @ResponseBody
        public String sevenDaysLogin(HttpServletRequest request, HttpServletResponse response, @RequestBody Map<String, String> map) {
            System.out.println("-ppppppppppppppppppppp-p-p-p-p-");
    
            String account = map.get("startDate");
            String pwd = map.get("endDate");
            String flag = map.get("planLanes");
    
            System.out.println(map.get("startDate"));
            System.out.println(map.get("endDate"));
            System.out.println(map.get("planLanes"));
    
            if (!("2022-01-25".equals(account) && "2022-01-28".equals(pwd))) {
                System.out.println("密码错误");
                return "error";
            }
            HttpSession session = request.getSession(true);
            if ("[1]".equals(flag)) {
                //使用7天免密登录功能   (这里注意一下,如果下一次登陆又点了七天免登陆,那么就会重新计算天数)
    
                Cookie cookie = new Cookie("JSEESIONID", session.getId());
                cookie.setMaxAge(60*60*24*7);
    
                session.setMaxInactiveInterval(60*60*24*7);
                session.setAttribute(session.getId(),"下次用户只需要带着没有失效的Cookie,在7天内就可以完成登录了。无需再次校验数据库中用户名密码信息。");
    
                String id = session.getId();
                System.out.println(cookie.getValue()+"......--------------服务端响应到客户端的cookie-id------------------...."+id);
    
                response.addCookie(cookie);
            } else {
                //不使用7天免密登录功能
                /*设置session的生命周期,,  180是三分钟*/
                request.getSession().setMaxInactiveInterval(180);
                /*设置cookie的jsessionid的值和生命周期*/
                Cookie c = new Cookie("JSESSIONID", request.getSession().getId());
                //关闭浏览器后,丢失Cookie
                c.setMaxAge(-1);
                /*将cookie放入到响应对象中*/
                response.addCookie(c);
            }
    
            //设置Session的名字。
            session.setAttribute("username","startDate");
    
            return "ok";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    4.2、通过客户端浏览器提交上来的cookie,找到对应的Session内容

    • 判断是否有对应Session,Session是否失效。
        @RequestMapping("/getLogin")
        @ResponseBody
        public String getLogin(HttpServletRequest request, HttpServletResponse response) {
    
            System.out.println("-pppppppppppppppppppppppppppppppppppppppppp-------------------------");
    
            Cookie[] cookies = request.getCookies();
            HttpSession session = request.getSession(true);
    
            Object[] objects = Arrays.stream(cookies).toArray();
            for (int i = 0; i < cookies.length; i++) {
                System.out.println(cookies[i].getName()+"...........客户端传上来的cookie........."+cookies[i].getValue());
                System.out.println(cookies[i].getMaxAge()+"....................");
            }
    
    
    
            Object attribute = session.getAttribute(cookies[0].getValue());
    
            System.out.println(attribute);
    
            return "OK";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    5、使用APIPost测试,可以使用

    • 红线上面打印信息是服务器响应到客户端的SessionID。
    • 下面是客户端携带的SessionID,在服务端Session中可以被找到。
      在这里插入图片描述
  • 相关阅读:
    JDBC学习笔记
    前端工程师的vue面试题笔记
    Python爬虫有哪些库,分别怎么用
    Java 多线程分批同步数据
    【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
    C++之多态
    Gin 中的 Session(会话控制)
    小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务
    RabbitMQ中延迟队列的全方位解析
    由CPU高负载引发内核探索之旅
  • 原文地址:https://blog.csdn.net/qq_35604488/article/details/127714046