会话技术是什么?
在一次会话的范围内的多次请求和响应之间,共享数据。
一次会话是什么?
客户端浏览器第一次给web服务器资源发送请求,会话建立,直到有一方断开为止。
Cookie:客户端会话技术
- 介绍:
- cookie存储数据在客户端浏览器;
- 浏览器对单个cookie的大小限制为4KB,对同一个域名下最多存放20个Cookie;
- 每个cookie以键值对(name-value),且name是唯一的。相同名字时,后者会覆盖掉前者;
- 作用:
- cookie一般用于存出少量的不太敏感的数据
- 曾经登录过网站,再次进入,在不登录的情况下,完成服务器对客户端的身份识别进行自动登录;
- cookie存储分类:
- 会话性:默认情况下,cookie存储在浏览器的内存中,当浏览器关闭后,Cookie数据被销毁;
- 持久性:可以用setMaxAge(int seconds)设置cookie的生命周期,seconds是以秒为单位的时间:
- seconds是正数时:将Cookie数据写到硬盘的文件中,并指定cookie存活时间,时间到后,cookie文件自动失效;
- seconds是负数时:默认值;
- seconds是零时:删除cookie信息;
- 原理
浏览器第一次发请求到服务器,服务器在响应头加上set-cookie的响应字段并返回给浏览器,当再次请求服务器时请求头cookie实现在一次会话内; - 使用步骤
//0. 设置响应的消息体的数据格式以及编码
response.setContentType("text/html;charset=utf-8");
//1.创建Cookie对象,绑定数据
Cookie cookie = new Cookie("name","王五");
//2. 发送Cookie对象
//2.1设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 7);//一周
//2.2发送
response.addCookie(cookie);
//3.在另个Servlet获取Cookie,拿到数据
Cookie[] cookies = request.getCookies();
- Cookie中存储中文问题
在tomcat 8 之前 cookie中不能直接存储中文数据,否则会出现中文乱码,建议用tomcat 8以及之后的版本。
但是tomcat 8以及之后的版本对特殊字符不支持,建议使用URL编码存储,URL解码解析;
//获取当前时间的字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//解析当前时间转换为自定义的格式
String str_date = sdf.format(date);
//URL编码存储
str_date = URLEncoder.encode(str_date, "UTF-8");
//获取Cookie的value,时间
String value = c.getValue();
//URL解码解析:
value = URLDecoder.decode(value,"utf-8");
Session:服务器端会话技术
- 介绍:
- 在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中(HttpSession)。
- 可以存储任意类型,任意大小的数据。
- Session与Cookie的区别:
- session存储数据在服务器端,Cookie在客户端;
- session没有数据大小限制,Cookie大小限制4kb;
- session数据安全,Cookie相对于不安全。
- 原理:Session的实现是依赖于Cookie的
客户端发送一个请求到服务器端时,服务器会先检查请求中Cookie是否含有JSESSIONID?- 没有JSESSIONID说明是第一次请求,服务器会创建一个session对象,并将该session对象的sessionid放到响应头的set-cookie中,客户端再请求时cookie中就会有一个name为JSESSIONID的cookie,value是sessionid;
- 有就会在服务器端查找sessionid与JSESSIONID的value是否相同,相同查找对应的session;所以Session的实现是依赖于Cookie的。
- 使用
//获取HttpSession对象
HttpSession session = request.getSession();
//设置键值为name=lisi并往session中存放
session.setAttribute("name","lisi");
//获取键名为name的值,并转换为string
String checkCode_session = String.valueOf(session.getAttribute("name"));
//移除键名为name
session.removeAttribute("name");
- session什么时候被销毁?
- 服务器关闭;
- session对象调用invalidate() ;
- session默认失效时间 30分钟;
- 可以配置修改,例如在Tomcat的conf文件中的web.xml,修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
- 默认情况下。不是。
- 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
- 例:
//session.getId():获取sessionid
Cookie c = new Cookie("JSESSIONID",session.getId());
//设置cookie的存活时间
c.setMaxAge(60*60*24);//一天
response.addCookie(c);
- 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是,但是要确保数据不丢失。服务器自动完成 session的钝化和活化;- session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上。
- session的活化:在服务器启动后,将session文件转化为内存中的session对象。
本文介绍了会话技术,包括Cookie和Session的基本概念、工作原理及区别。Cookie存储数据在客户端,受大小和数量限制,适用于存储少量非敏感信息。Session则在服务器端存储数据,安全性更高,但依赖于Cookie。此外,文章还探讨了Session的销毁条件和钝化、活化过程。

3178

被折叠的 条评论
为什么被折叠?



