Cookie和Session

会话技术是什么?

在一次会话的范围内的多次请求和响应之间,共享数据。

一次会话是什么?

客户端浏览器第一次给web服务器资源发送请求,会话建立,直到有一方断开为止。

Cookie:客户端会话技术

  1. 介绍:
    • cookie存储数据在客户端浏览器;
    • 浏览器对单个cookie的大小限制为4KB,对同一个域名下最多存放20个Cookie;
    • 每个cookie以键值对(name-value),且name是唯一的。相同名字时,后者会覆盖掉前者;
  2. 作用:
    • cookie一般用于存出少量的不太敏感的数据
    • 曾经登录过网站,再次进入,在不登录的情况下,完成服务器对客户端的身份识别进行自动登录;
  3. cookie存储分类
    • 会话性:默认情况下,cookie存储在浏览器的内存中,当浏览器关闭后,Cookie数据被销毁;
    • 持久性可以用setMaxAge(int seconds)设置cookie的生命周期,seconds是以秒为单位的时间:
      • seconds是正数时:将Cookie数据写到硬盘的文件中,并指定cookie存活时间,时间到后,cookie文件自动失效;
      • seconds是负数时:默认值;
      • seconds是零时:删除cookie信息;
  4. 原理
    浏览器第一次发请求到服务器,服务器在响应头加上set-cookie的响应字段并返回给浏览器,当再次请求服务器时请求头cookie实现在一次会话内;
  5. 使用步骤
 //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();
  1. 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:服务器端会话技术

  1. 介绍:
    • 在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中(HttpSession)。
    • 可以存储任意类型,任意大小的数据。
  2. Session与Cookie的区别:
    • session存储数据在服务器端,Cookie在客户端;
    • session没有数据大小限制,Cookie大小限制4kb;
    • session数据安全,Cookie相对于不安全。
  3. 原理:Session的实现是依赖于Cookie的
    客户端发送一个请求到服务器端时,服务器会先检查请求中Cookie是否含有JSESSIONID?
    • 没有JSESSIONID说明是第一次请求,服务器会创建一个session对象,并将该session对象的sessionid放到响应头的set-cookie中,客户端再请求时cookie中就会有一个name为JSESSIONID的cookie,value是sessionid;
    • 有就会在服务器端查找sessionid与JSESSIONID的value是否相同,相同查找对应的session;所以Session的实现是依赖于Cookie的。
  4. 使用
//获取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");
  1. session什么时候被销毁?
    • 服务器关闭;
    • session对象调用invalidate() ;
    • session默认失效时间 30分钟;
      • 可以配置修改,例如在Tomcat的conf文件中的web.xml,修改
<session-config>
	<session-timeout>30session-timeout>
session-config>
  1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
    • 默认情况下。不是。
    • 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
    • 例:
//session.getId():获取sessionidCookie c = new Cookie("JSESSIONID",session.getId());
//设置cookie的存活时间
c.setMaxAge(60*60*24);//一天
response.addCookie(c);
  1. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
    不是,但是要确保数据不丢失。服务器自动完成 session的钝化和活化;
    • session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上。
    • session的活化:在服务器启动后,将session文件转化为内存中的session对象。

你可能感兴趣的:(java,servlet,tomcat)