会话技术

1概念:一次会话中包含多次请求和响应;

浏览器第一次给服务器资源发送请求;关闭就

一次会话:

2功能:

共享数据,

3方式:

  • 客户端会话技术:Cookie,存在客服端
  • 服务器:Session

一:Cookie

概念:客户端会话技术:将数据保存到客户端

快速入门:

  1. 响应头里面设置。
  2. Demo01.java
Cookie cookie = new Cookie("msg", "hello");
 response.addCookie(cookie);

在请求头里面获取设置的内容;

第二个Demo02.java

Cookie[] cookies = request.getCookies();
if(cookies!=null){
    for (Cookie cookies1:cookies
         ) {
        String name = cookies1.getName();
        String value = cookies1.getValue();
        System.out.println(name + value);

    }
}

实现原理

  1. 客户端—服务器端的第2条线:响应和第三条线:请求线上上分别有数据cookie的set和传递
  2. 基于2响应头set-cookle和3请求头cookie实现

细节:

可以创建多个Cookie对象,使用response调用多次addCooke();
保存多久?
  1. 默认保存在浏览器,当浏览器关闭后。Cookoie数据销毁
  2. 持久化存储:
  1. setMaxAge(int seconds)
Cookie cookie = new Cookie("msg", "hello");
 
 cookie.setMaxAge(30);
 response.addCookie(cookie);

  1. 正数:将Cookie数据写道硬盘的文件中,持久化存储。seconds存活时间
  2. 负值:就上面的1,关闭浏览器的时候就会销毁;默认值
  3. 0:删除Cookie数据;
Cookie能不能存储中文?
  1. 在tomcat8以前不能存储支持中文数据;
  2. 对于特殊字符空格还是不行;可以编码后传给Cookie,展示在也页面的时候,再解码;
  3. 使用编码和解码的静态方法:
Date date = new Date();
 String str = "sss s";
 //编码
 String encode = URLEncoder.encode(str, "utf-8");
 
 //解码
 String decode = URLDecoder.decode(encode, "utf-8");
Cookie的获取范围,共享有多大?
  1. 一个tomacat服务器中,部署多个项目,在这些项目中多个Cookie能否共享?
  1. 默认不行;
  2. 如果要共享:可以设置 setPath(String path),其中path位“/”
  3. cookie.setPath("/");
  1. 不同的tomacat服务Cookie共享问题?
  1. setDomian(String path):如果设置一级的域名相同,那么多个服务器之间的cookie可以共享;

4cook的特点

  1. 存在客户端浏览器
  2. 对于大小有限制4kb,以及同一个域名下的总cookie的数量有限制20个,
  3. 作用:使用场景:
  1. cookie一般用于存少量不太敏感的数据;
  2. 在不登录的前提下,完成服务器堆客户端的身份识别

5注意事项:

即使设置一个cookie,在request.getCookies().生成的数组,是两个,还有一个默认的;

尤其在设置全局变量的flag值的时候,要注意;

二:Session

1HTTPSession;服务器端会话技术;

2快速入门:

获取HttpSession对象:

//:demo01
HttpSession session = request.getSession();
session.setAttribute("msg","hello");

使用Httpsession对象:

//:demo02
HttpSession session = request.getSession();
session.getAttribute("msg");

原理:

1:Session的依赖于cookie的;当;两者都没有的时候,服务器创建一个Session对象,会在第一场的响应头创建一个对象的记录id,(JGSSionID);然后在第二场的请求头去访问服务器的时候,会带着这个id去查看这个Session;这样也保证了服务器两次getSession是同一个值;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZZ1GDniK-1623413918033)(C:\Users\12479\AppData\Roaming\Typora\typora-user-images\image-20210610164918383.png)]

2:细节:

  1. Session获取的是一个值,不是数组,为空时返回的是null.
  2. 当客户端关闭.服务器不关闭,两次获取的Session是同一个值么?
  1. 默认不是;
  2. 可以用(1)设置cookie来解决,(2)并且设定setMaxAge()长一些(因为默认为关闭浏览器也就是客服端,就管删除cookie);
  1. 客户端不关闭,服务器关闭,相同么?
  1. 不同;(直接输出session.GetId(),是一个JSESSIONId);也就是hashcode的值不同)
  2. 不是同一个,但是要确保数据不丢失:
  1. Session的钝化;
  1. tomcat做了已经;idea可以完成钝化(生成work);完成不了活化(work目录在启动的时候会删除,重新生成一个);
  2. 在服务器正常关闭之前.将session对象序列化到硬盘保存
  1. Session的活化;
  1. 在服务器启动后;将session文件转化为内存中的session对象即可;
  1. session什么时候被销毁?
  1. 服务器关闭
  2. Session对象调用invalidate();
  3. timeout默认时间30minutes;在Web.xml文件中,有个文件;
  1. session的特点
  1. session用于存储一次会话的多次请求数据,存在服务器端,比request.getServletContext().setAttribute();范围小,经常用session共享一次会话;
  2. session可以存储任意类型,Obiect;
Session和cookie的区别:
  • cookie,在客户端,
  • session没有数据大小限制;cookie有大小区别,比较小的数据限制
  • Session相对数据安全

request.getServletContext().setAttribute();范围小,经常用session共享一次会话;
2. session可以存储任意类型,Obiect;

Session和cookie的区别:
  • cookie,在客户端,
  • session没有数据大小限制;cookie有大小区别,比较小的数据限制
  • Session相对数据安全