0
点赞
收藏
分享

微信扫一扫

客户端会话------Cookie


​​概念​​

​​使用例子​​

​​ 原理​​

​​Cookie的使用​​

​​Cookie是保存在浏览器上的会话​​

​​Cookie在浏览器中保存的时间​​

​​默认情况下,当浏览器关闭后,Cookie数据被摧毁​​

​​持久化存储:setMaxAge(int seconds)​​

​​Cookie的共享范围​​

​​同一个服务器中,多个web项目共享​​

​​不同的tomcat服务器间Cookit共享​​

​​特点​​

​​作用​​



概念

客户端会话技术



使用例子



CookieDemo1写入Cookie,CookieDemo2获取Cookie



CookieDemo1代码


package com.lingaolu.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
response.addCookie(c1);
response.addCookie(c2);
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}


CookieDemo2代码


package com.lingaolu.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.stream.Stream;

/**
* @author 林高禄
* @create 2020-07-20-8:54
*/
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
StringBuilder str = new StringBuilder();
Stream.of(cookies).forEach(s->str.append(s.getName()).append(":").append(s.getValue()).append("<br>") );
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(str.toString());
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}


运行先访问CookieDemo2,什么Cookie都没有

客户端会话------Cookie_Cookie



再访问CookieDemo1,写入Cookie,然后再访问CookieDemo2,CookieDemo1写入的Cookie就能访问到了

客户端会话------Cookie_客户端_02



 这样就访问到我们的Cookie了



 原理



我们清除一下谷歌浏览器的Cookie数据

客户端会话------Cookie_客户端_03




重新启动项目,我们访问CookieDemo1,F12看一下

客户端会话------Cookie_会话_04



访问CookieDemo1的时候,服务器收到了我们写入Response的Cookie,服务器把响应返给浏览器,那么浏览器就会保存这些Cookie



我们再访问CookieDemo2,F12看一下

客户端会话------Cookie_会话_05



访问CookieDemo1的时候,浏览器已经保存了我们写入的Cookie,所以访问CookieDemo2的时候,会把这些保存的Cookie放入请求头,这样我们就能获取到Cookie



通过上面例子,我们可以知道,Cookie可以发送多个,也能发送中文 (tomcat8),如果是tomcat8之前的版本,就需要进行URL进行转码



Cookie的使用



Cookie是保存在浏览器上的会话



上面的访问,我们已经知道谷歌浏览器访问CookieDemo2能拿到了我们的Cookie,那么我们用火狐浏览器访问CookieDemo2看一下

客户端会话------Cookie_ide_06



 发现并没有任何Cookie数据,通过上面的原理我们就知道,因为我们访问CookieDemo1是通过谷歌浏览器访问的,所以会话的保存是保存在了谷歌浏览器,所以用火狐访问CookieDemo2的时候,并没有任何Cookie



我们用火狐浏览器访问CookieDemo1,写入Cookie到响应,这样Cookie也就保存在了火狐,这样火狐访问CookieDemo2的时候,也就能获取到Cookie了

客户端会话------Cookie_客户端_07



Cookie在浏览器中保存的时间



默认情况下,当浏览器关闭后,Cookie数据被摧毁



我们访问CookieDemo2,可以访问到Cookie数据

客户端会话------Cookie_客户端_08



现在我们关掉这个浏览器,再次打开浏览器访问CookieDemo2,就没有Cookie数据了

客户端会话------Cookie_客户端_09



持久化存储:setMaxAge(int seconds)



seconds:


  • 正数:将Cookie数据写到硬盘的文件中。持久化存储,seconds秒后自动删除
  • 负数:默认值,关闭浏览器就会消失
  • 零:删除



我们改下CookieDemo1的代码,将Cookie  c1持久化到硬盘30秒


package com.lingaolu.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
// 将Cookie c1持久化到硬盘,30秒后自动删除
c1.setMaxAge(30);
response.addCookie(c1);
response.addCookie(c2);
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}


启动访问CookieDemo1

客户端会话------Cookie_Cookie_10



接着访问CookieDemo2

客户端会话------Cookie_ide_11



关闭浏览器,再次打开,再访问CookieDemo2

客户端会话------Cookie_会话_12



因为我们只把Cookie  c1持久化到硬盘30秒,而Cookie  c2没有持久化,所以关闭浏览器后,c2就被删除了,而c1还存在



过了30秒后,我们再刷新CookieDemo2,c1也被删除了

客户端会话------Cookie_ide_13



 我们修改下CookieDemo1的代码,将Cookie  c1持久化到硬盘1小时(足够时间修改代码,删除Cookie)


package com.lingaolu.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
// 将Cookie c1持久化到硬盘,30秒后自动删除
c1.setMaxAge(60*60);
response.addCookie(c1);
response.addCookie(c2);
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}


重启,访问CookieDemo1,关闭浏览器,再访问CookieDemo2

客户端会话------Cookie_会话_14

客户端会话------Cookie_ide_15

 Cookie已被存在硬盘,时间1小时



现在我们修改CookieDemo1代码,把时间改为负数(删掉Cookie)


package com.lingaolu.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
// 将Cookie c1删除
c1.setMaxAge(0);
response.addCookie(c1);
response.addCookie(c2);
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}


 启动,访问CookieDemo1

客户端会话------Cookie_客户端_16




 接着访问CookieDemo2

客户端会话------Cookie_客户端_17



发现name没有了,也就是Cookie  c1已经没有了,因为我们访问CookieDemo1的时候执行代码,删除了

客户端会话------Cookie_客户端_18



Cookie的共享范围



同一个服务器中,多个web项目共享



我们再建一个web项目bServlet2,建一个类CookieDemo1,获取Cookie

客户端会话------Cookie_客户端_19



然后部署bServlet的时候,把bServlet2也部署进来,部署在同一个服务器

客户端会话------Cookie_java_20

客户端会话------Cookie_ide_21


客户端会话------Cookie_java_22


客户端会话------Cookie_Cookie_23

取虚拟路径为web2

客户端会话------Cookie_ide_24



调整一下bServlet的 CookieDemo1代码,修改Cookie  c1的Path为“/”


package com.lingaolu.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
c1.setPath("/");
// c2没有设置,默认为当前web项目的虚拟路径
response.addCookie(c1);
response.addCookie(c2);
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}



启动访问web的CookieDemo1

客户端会话------Cookie_ide_25



再访问web2的CookieDemo1

客户端会话------Cookie_客户端_26



发现可以获取到Cookie  c1的数据name,因为Cookie  c1设置了Path为“/”,表示同一个服务器中共享,而bServlet2和bServlet在同一服务器中,所以bServlet2也能获取到。而Cookie  c2没有设置,默认为当前web项目共享,也就是bServlet范围内共享,



不同的tomcat服务器间Cookit共享



setDomain(String path):如果设置一级域名相同,那么多个服务器之间Cookit共享

比如:setDomain(".baidu,com"),那么tieba..baidu,com和news.baidu,com中Cookit共享



特点




  • Cookit存储数据在客户端浏览器
  • 浏览器对于单个Cookit的大小有限制(4kb)以及对同一个域名下的总Cookit数量也有限制(20个)



作用




  • Cookit一般用于存储少量的不太敏感的数据
  • 在不登录的情况下,完成服务器对客户端的身份识别



举报

相关推荐

0 条评论