当前位置 博文首页 > A_art_xiang的博客:session和cookie到底有什么联系?这一篇文章

    A_art_xiang的博客:session和cookie到底有什么联系?这一篇文章

    作者:[db:作者] 时间:2021-07-14 13:12

    目录

    存储读取session测试

    5.如何用java获取请求和响应中HttpHeaders的Cookie呢?

    6.cookie的格式

    7.cookie如何存储JSESSIONID?


    session和cookie的区别:

    cookie是存储在本地数据;session是存储在服务器上的数据。

    存储读取session测试

    1.先写两行代码,在同一个服务器下,先后存储session和取session。

        @RequestMapping("testSession1")
        public void testSession1(){
            //存储session
            request.getSession().setAttribute("test", "content");
            System.out.println("存储test的值为content");
        }
        @RequestMapping("testSession2")
        public void testSession2(){
            //打印上次存储的session
            System.out.println(request.getSession().getAttribute("test"));
        }

    2.用浏览器分别请求这两个请求。

    显示结果:
    存储test的值为content
    content
    

    原因分析:浏览器自从将服务器端返回的cookie保存了起来,下次再访问同一个服务,就会带着之前的cookie访问,来证明是同一个用户

    3.用postman分别请求这两个请求。(postman自带cookie,如果JSESSIONID相同的话,服务器端也会认为这是同一个用户发起的两个请求,所以请求结果和用浏览器一样)

    请求结果:

    存储test的值为content
    content
    

    4.用redisTemplate或者httpClient分别请求,因为请求的Headers中不包含Cookie,所以被服务器端认作不同用户的请求,所以第二个请求session取不到。

    5.如何用java获取请求和响应中HttpHeaders的Cookie呢?

    //获取响应的Cookie
    HttpHeaders headers = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class).getHeaders();
    List<String> cookies = headers.get("Set-Cookie");
    
    //向请求header放cookie
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.put("Cookie", cookies);
    HttpEntity<String> requestEntity2 = new HttpEntity<String>(null, httpHeaders);
    restTemplate.exchange(url2, HttpMethod.GET, requestEntity2, String.class);
    
    //获取cookie
    public static List<String> getCookieList(HttpServletRequest request) {
        List<String> cookieList = new ArrayList<>();
    
        Cookie[] cookies = request.getCookies();
        if (cookies == null || cookies.length == 0) {
            return cookieList;
        }
    
        for (Cookie cookie : cookies) {
            cookieList.add(cookie.getName() + "=" + cookie.getValue());
        }
    
        return cookieList;
    }

    6.cookie的格式

      根据Netscape公司的规定,Cookie格式如下:

      Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

      NAME=VALUE:

      这是每一个Cookie均必须有的部分。NAME是该Cookie的名称,VALUE是该Cookie的值。在字符串“NAME=VALUE”中,不含分号、逗号和空格等字符。
      Expires=DATE:Expires变量是一个只写变量,它确定了Cookie有效终止日期。该属性值DATE必须以特定的格式来书写:星期几,DD-MM-YY HH:MM:SS GMT,GMT表示这是格林尼治时间。反之,不以这样的格式来书写,系统将无法识别。该变量可省,如果缺省时,则Cookie的属性值不会保存在用户的硬盘中,而仅仅保存在内存当中,Cookie文件将随着浏览器的关闭而自动消失。
      Domain=DOMAIN-NAME:Domain该变量是一个只写变量,它确定了哪些Internet域中的Web服务器可读取浏览器所存取的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。这项设置是可选的,如果缺省时,设置Cookie的属性值为该Web服务器的域名。
      Path=PATH:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie。一般如果用户输入的URL中的路径部分从第一个字符开始包含Path属性所定义的字符串,浏览器就认为通过检查。如果Path属性的值为“/”,则Web服务器上所有的WWW资源均可读取该Cookie。同样该项设置是可选的,如果缺省时,则Path的属性值为Web服务器传给浏览器的资源的路径名。
      可以看出我们借助对Domain和Path两个变量的设置,即可有效地控制Cookie文件被访问的范围。
      Secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。

    7.cookie如何存储JSESSIONID?

    https://blog.csdn.net/chunqiuwei/article/details/23461995

    cs