【Spring】Cookie和Session

系列文章目录

第一章 初识Spring MVC



前言

HTTP是"无状态"的协议,我们可以理解为它没有记忆力。无论来了多少次,他都会从头到尾重新执行。但是我们希望它能够在特定的情况下存在“记忆”,以账号密码为例,我们希望进入网站时存储着以前使用过的账号密码。这就需要借助Cookie和Session的帮助了。


一、Cookie和Session

**Cookie存在客户端中。Session存放在服务器中。 **
以CSDN为例,当我们进入CSDN后需要登录才能进行更多操作,在之后的一段时间里,我们都不需要重新进行登录操作,CSDN也能够直接获取到我们的信息。

  1. 登录后服务器创建Session存储信息,并通过set-Cookie 将SessionID 存放在Cookie中。
  2. 在客户端后续再给服务器发送请求时,都需要在请求中带上SessionId
  3. 服务器收到请求后,将请求中的SessionId在对应的Session中获取到对应的信息,再进行后续操作。
  4. 如果找不到对应的Session 就会重新创建Session 并把SessionID返回。

二、Cookie操作

在客户端中,Cookie是可以伪造的,我们可以通过开发者模式设置Cookie。在下文中都会通过伪造Cookie的方式作为数据。
在这里插入图片描述

获取Cookie

我们可以通过代码操作获取到Cookie,SessionID也只是Cookie中的一部分。
在下面的代码中,HttpServletRequest 操作中都有对Cookie的相关设置包括获取和添入。

@RequestMapping("/getCookie")
    public String getCookies(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for(Cookie cookie : cookies) {
                System.out.println(cookie.getName() + ": 			  		
                "+cookie.getValue());
            }
        }
        return "获取Cookie成功";
    }

Cookie中的数据有效时间大概是半小时左右,我们也可以对它进行设置。因此即使我们重新运行程序,Cookie在短时间内也不会消失。而运行这段代码的结果如下图所示

在这里插入图片描述

指定Cookie

在上面我们获取Cookie是获取全部的Cookie,我们也可以使用Spring的注解 @CookieValue 指定获取Cookie中的指定数据
在http://127.0.0.1:8080/中我们伪造Cookie三个数据,接下来我们通过代码获取指定的数据name,通过注解指定的name赋值到方法参数中。
在这里插入图片描述

	@RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("name") String name) {
        System.out.println("获取到Cookie:" + name);
        return "获取Cookie成功";
    }

在这里插入图片描述

三、Session操作

与Cookie一样,我们也可以通过代码去获取Session和设置Session中的数据。
在HttpServletRequest类中不只有getCookie,同时也有对应的Session方法。

设置Session数据

Session是服务器中的数据,是无法像Cookie那样在客户端伪造的。因此提供了setAttribute方法设置Session中的数据。
在下面的代码中,首先调用了getSession方法,旨在查看该网站中是否原本就存在Session 如果存在,就继续在原Session下进行数据管理;如果不存在Session,就创建Session.
设置参数值为true即当不存在Session时,创建一个新的Session

	@RequestMapping("/setSession")
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession(true);
        session.setAttribute("name","zhangsan");
        session.setAttribute("age","111");
        return "设置Session成功";
    }

代码运行结果如下,在运行代码之后,我们可以看到除了原先伪造的Cookie,还多了一个“JSESSIONID” 里面存储的就是SessionID等关于Session的数据。
在这里插入图片描述

获取Session数据

在获取Session数据中,同样的我们可以使用HttpServletRequest提供的getAttribute方法获取数据

	@RequestMapping("/getSession")
    public String getSession(HttpServletRequest request) {
        //如果参数为false 不存在session时返回null
        HttpSession session = request.getSession(false);
        if (session != null) {
            System.out.println(session.getAttribute("name"));
            System.out.println(session.getAttribute("age"));
        }
        return "成功获取Session";
    }

代码结果如下
在这里插入图片描述
为了方便,Java又提供了一个类HttpSession对session进行操作。与HttpServelet类相比,它不需要进行参数值设置,当session为null时就会自动创建出一个新的Session
同时带有一个注解@SessionAttribute 设置required为false时为非必填项。
我们可以通过这个注解获取指定的参数数据。

	@RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute(value = "name",required = 
    false) String name) {
        System.out.println("name:" + name);
        return "成功获取Session";
    }

在这里插入图片描述

四、获取Header

与前两个一样,使用的还是HttpServletRequest类中的getHeader方法
在下面的代码中我们获取Header中的User-Agent数据

	@RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent");
        return "userAgent: " + userAgent;
    }

运行结果如下图
在这里插入图片描述
同样的可以指定元素进行赋值

	@RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("USer-Agent") String 
    userAgent) {
        return "userAgent:" + userAgent;
    }

总结

Cookie和Session是网站开发中一个关键的节点,连通服务器和客户端之间的桥梁。
本文通过HttpServletRequest类对Cookie、Session、Header进行设置以及获取操作。
同时,在注解方面,@CookieValue、@SessionAttribute、@RequestHeader注解都能够获取指定属性的数据。
源码可见Cookie和Session

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值