一. 会话技术

一次会话中包含多次请求和相应

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

  1. 功能 : 在一次会话的范围内的多次请求间, 共享数据
  2. 方式 :
  1. 客户端会话技术 : Cookie
  2. 服务器端会话技术 : Session

二. Cookie

  1. 概念 : 客户端会话技术, 客户端第一次请求服务器, 服务器携带一些数据响应给浏览器,响应之后, 浏览器会保存数据到本地. 下一次请求服务器时, 会带着这些数据一起发送请求(因此可以获取到存储在浏览器本地的数据)
  2. 使用步骤 :
  1. 创建Cookie对象, 绑定数据
    ​​​new Cookie(String name, String value);​
  2. 发送Cookie对象
    ​​​response.addCookie(Cookie cookie);​
  3. 获取Cookie,拿到数据
    ​​​Cookie[] request.getCookies()​
  1. 实现原理 : 基于响应头set-cookie和请求头cookie实现

Java_Web 会话技术_Cookie

第一次请求, 服务器给浏览器的响应中设置Cookie

Java_Web 会话技术_服务器_02

第二次访问服务器时, 浏览器的请求中会携带Cookie中的数据进行访问

Java_Web 会话技术_Session_03

  1. Cookie细节
  1. 一次能否发送多个Cookie?
    可以, 通过创建多个Cookie对象, 使用response调用多次addCookie方法发送Cookie即可.
  2. Cookie在浏览器中保存多长时间?
  1. 默认情况下, 当浏览器关闭后, Cookie数据被销毁
  2. 持久化存储 :
  • setMaxAge(int seconds)
  1. 正数 : 将Cookie数据写到硬盘的文件中. 持久化存储, Cookie存活时间
  2. 负数 : 默认值
  3. 零 : 删除Cookie信息
  1. Cookie能不能保存中文?
    在Tomcat 8 之前, Cookie中不能直接存储中文数据.
    ​ - 需要将中文数据转码 — 一般采用URL编码(%E3)
    Tomcat 8之后, Cookie支持中文.
    Tips:特殊字符仍不支持, 建议使用URL编码存储, URL解码解析
  • URL编码 : ​​URLEncoder.encode(date_format, "utf-8");​
  • URL解码 : ​​URLDecoder.decode(value, "utf-8");​
  1. Cookie共享问题?
  1. 假如在一个tomcat服务器中, 部署了多个web项目, 那么在这些web项目中cookie能不能共享?
  • 默认情况下cookie不能共享
  • setPath(String path) : 设置cookie的获取范围. 默认情况想, 设置当前的虚拟目录.
  1. 不同的tomcat服务器键cookie共享问题?
  • setDomain(String path) : 如果设置一级域名相同, 那么多个服务器之间cookie可以共享
  • setDomain(".baidu.com"), 那么tieba.baidu.com和news.baidu.com中cookie可以共享
  1. Cookie的特点和作用
  1. Cookie存储数据在客户端浏览器
  2. 浏览器对于单个Cookie的大小有限制(4kb)以及同一个域名下的总Cookie数量也有限制(20个)
  3. 作用 :
  1. Cookie一般用于存储少量的不太敏感的数据
  2. 在不登录的情况下, 完成服务器对客户端的身份识别
  1. 案例 : 记住上一次访问时间
  • 需求 :
  1. 访问一个Servlet, 如果是第一次访问, 则提示: 您好, 欢迎您首次访问
  2. 如果不是第一次访问, 则提示, 欢迎回来, 您上次访问时间为 : 显示时间字符串
  • 分析 :
  1. 可以采用Cookie来完成
  2. 在服务器中的Servlet判断是否有一个名为lastTime的Cookie
  1. 有 : 不是第一次访问
  1. 响应数据 : 欢迎回来, 您上次访问时间为 : ​​xxxx年xx月xx日 xx:xx:xx​
  2. 写会Cookie : lastTime = ​​xxxx年xx月xx日 xx:xx:xx​
  1. 没有 : 是第一次访问
  1. 响应数据 : 您好, 欢迎您首次访问
  2. 写会Cookie : lastTime = ​​xxxx年xx月xx日 xx:xx:xx​
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
Date date = new Date();
// 设置Cookie的value
// 获取当前时间的字符串, 重新设置Cookie的值, 重新发送cookie
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String date_format = sdf.format(date);

// URL 编码 :
date_format = URLEncoder.encode(date_format, "utf-8");
System.out.println("编码后 : " + date_format);

Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
// 不是第一次访问
if ("lastTime".equals(cookie.getName())) {

// 响应数据
// 获取Cookie的value, 时间
String value = cookie.getValue();

// URL解码
value = URLDecoder.decode(value, "utf-8");

response.getWriter().write("<h1>欢迎回来, 您上次访问时间为 :" + value + "</h1>");

cookie.setValue(date_format);
// 设置cookie的存活时间 : 一个月
cookie.setMaxAge(60 * 60 * 24 * 30);
response.addCookie(cookie);

return;
}
}
}
response.getWriter().write("<h1>您好, 欢迎您首次访问!");

// 是第一次访问
Cookie lastTime = new Cookie("lastTime", date_format);
lastTime.setMaxAge(60 * 60 * 24 * 30);
response.addCookie(lastTime);
}

三. Session

  1. 概念 : 服务器端会话技术, 在一次会话的多次请求间共享数据, 将数据保存在服务器端的对象中. HttpSession
  2. 使用步骤 :
  1. 获取HttpSession对象 :
    ​​​HttpSession session = request.getSession();​
  2. 使用HttpSession对象 :
    ​​​Object getAttribute(String name)​​​​void setAttribute(String name, Object value)​​​​void removeAttribute(String name)​
  1. 原理 :
    Session的实现是依赖于Cookie的

    设置sessoin后, 请求浏览器, 服务器会响应一个以Cookie形式的JSESSIONID给浏览器,

    之后,在访问其他的页面时, 请求中Cookie会携带JSESSIONID来看是否是同一个seesion.
  2. 细节
  1. 当客户端关闭后, 服务器不关, 两次获取session是否为同一个?
  • 默认情况下, 获取的不是同一个session
  • 如果需要相同, 则可以通过创建Cookie, 并将键设为JSESSIONID, 值为session.getID(), 然后设置最大存活时间, 让Cookie持久化保存
Cookie c = new Cookie("JSESSIONID", session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
  1. 客户端不关闭, 服务器关闭后, 两次获取的session是同一个么?
  • 对于Tomcat来说, sessionID不同, 但是里面存储的数据是不会变的
  • idea, 不仅sessionID不同, 存储的数据也会清空
  • session的钝化 : 在服务器正常关闭之前, 将session对象序列化到硬盘上
  • session的活化 : 在服务器启动后, 将session文件转化为内存中的session对象即可
  1. session的失效时间?
  1. 服务器关闭
  2. session对象调用 invalidate() 可以自行销毁
  3. session默认失效时间30分钟
    该默认时间可以自己修改 : 在​​Tomcat目录 -> conf -> web.xml​​中
<session-config>
<session-timeout>30</session-timeout>
</session-config>
  1. Session的特点
  1. session用于存储一次会话的多次请求的数据, 存在服务器端
  2. session可以存储任意类型, 任意大小的数据
  3. session与Cookie的区别 :
  1. session存储数据在服务器端, Cookie在客户端
  2. session没有数据大小限制, Cookie有
  3. session数据安全, Cookie相对不安全