会话技术
1概念:一次会话中包含多次请求和响应;
浏览器第一次给服务器资源发送请求;关闭就
一次会话:
2功能:
共享数据,
3方式:
- 客户端会话技术:Cookie,存在客服端
- 服务器:Session
一:Cookie
概念:客户端会话技术:将数据保存到客户端
快速入门:
- 响应头里面设置。
- 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);
}
}
实现原理
- 客户端—服务器端的第2条线:响应和第三条线:请求线上上分别有数据cookie的set和传递
- 基于2响应头set-cookle和3请求头cookie实现
细节:
可以创建多个Cookie对象,使用response调用多次addCooke();
保存多久?
- 默认保存在浏览器,当浏览器关闭后。Cookoie数据销毁
- 持久化存储:
- setMaxAge(int seconds)
Cookie cookie = new Cookie("msg", "hello");
cookie.setMaxAge(30);
response.addCookie(cookie);
- 正数:将Cookie数据写道硬盘的文件中,持久化存储。seconds存活时间
- 负值:就上面的1,关闭浏览器的时候就会销毁;默认值
- 0:删除Cookie数据;
Cookie能不能存储中文?
- 在tomcat8以前不能存储支持中文数据;
- 对于特殊字符空格还是不行;可以编码后传给Cookie,展示在也页面的时候,再解码;
- 使用编码和解码的静态方法:
Date date = new Date();
String str = "sss s";
//编码
String encode = URLEncoder.encode(str, "utf-8");
//解码
String decode = URLDecoder.decode(encode, "utf-8");
Cookie的获取范围,共享有多大?
- 一个tomacat服务器中,部署多个项目,在这些项目中多个Cookie能否共享?
- 默认不行;
- 如果要共享:可以设置 setPath(String path),其中path位“/”
- cookie.setPath("/");
- 不同的tomacat服务Cookie共享问题?
- setDomian(String path):如果设置一级的域名相同,那么多个服务器之间的cookie可以共享;
4cook的特点
- 存在客户端浏览器
- 对于大小有限制4kb,以及同一个域名下的总cookie的数量有限制20个,
- 作用:使用场景:
- cookie一般用于存少量不太敏感的数据;
- 在不登录的前提下,完成服务器堆客户端的身份识别
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:细节:
- Session获取的是一个值,不是数组,为空时返回的是null.
- 当客户端关闭.服务器不关闭,两次获取的Session是同一个值么?
- 默认不是;
- 可以用(1)设置cookie来解决,(2)并且设定setMaxAge()长一些(因为默认为关闭浏览器也就是客服端,就管删除cookie);
- 客户端不关闭,服务器关闭,相同么?
- 不同;(直接输出session.GetId(),是一个JSESSIONId);也就是hashcode的值不同)
- 不是同一个,但是要确保数据不丢失:
- Session的钝化;
- tomcat做了已经;idea可以完成钝化(生成work);完成不了活化(work目录在启动的时候会删除,重新生成一个);
- 在服务器正常关闭之前.将session对象序列化到硬盘保存
- Session的活化;
- 在服务器启动后;将session文件转化为内存中的session对象即可;
- session什么时候被销毁?
- 服务器关闭
- Session对象调用invalidate();
- timeout默认时间30minutes;在Web.xml文件中,有个文件;
- session的特点
- session用于存储一次会话的多次请求数据,存在服务器端,比request.getServletContext().setAttribute();范围小,经常用session共享一次会话;
- session可以存储任意类型,Obiect;
Session和cookie的区别:
- cookie,在客户端,
- session没有数据大小限制;cookie有大小区别,比较小的数据限制
- Session相对数据安全
request.getServletContext().setAttribute();范围小,经常用session共享一次会话;
2. session可以存储任意类型,Obiect;
Session和cookie的区别:
- cookie,在客户端,
- session没有数据大小限制;cookie有大小区别,比较小的数据限制
- Session相对数据安全