Cookie 和 Session

会话技术

会话

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

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

功能

在一次会话的范围内的多次请求间,共享数据

方式

  1. 客户端会话技术:Cookie
  2. 服务器端会话技术:Session

概念

客户端会话技术,将数据保存到客户端

快速入门

  1. 创建 Cookie 对象,绑定数据

    new Cookie(String name, String value)

  2. 发送 Cookie 对象

    response.addCookie(Cookie cookie)

  3. 获取 Cookie,拿到数据

    Cookie[] request.getCookies()

实现原理

基于响应头 set-cookie 和请求头 cookie 实现

  • 可以
  • 可以创建多个 Cookie 对象,使用 response 调用多次 addCookie 方法发送 cookie 即可。
  1. 默认情况下,当浏览器关闭后,Cookie 数据被销毁

  2. 持久化存储:

    setMaxAge(int seconds)

    1. 正数:将 Cookie 数据写到硬盘的文件中。持久化存储。并指定 cookie 存活时间,时间到后,cookie 文件自动失效
    2. 负数:默认值
    3. 零:删除 cookie 信息
  • 在 tomcat 8 之前 cookie 中不能直接存储中文数据。需要将中文数据转码—一般采用 URL 编码 (%E3)
  • 在 tomcat 8 之后,cookie 支持中文数据。特殊字符还是不支持,建议使用 URL 编码存储,URL 解码解析
  1. 假设在一个 tomcat 服务器中,部署了多个 web 项目,那么在这些 web 项目中 cookie 能不能共享?

    • 默认情况下 cookie 不能共享

    • setPath(String path) : 设置 cookie 的获取范围。默认情况下,设置当前的虚拟目录

      如果要共享,则可以将 path 设置为”/“

  2. 不同的 tomcat 服务器间 cookie 共享问题?

    • setDomain(String path) : 如果设置一级域名相同,那么多个服务器之间 cookie 可以共享

setDomain(".baidu.com") , 那么 tieba.baidu.com 和 news.baidu.com 中 cookie 可以共享

  1. cookie 存储数据在客户端浏览器
  2. 浏览器对于单个 cookie 的大小有限制 (4kb) 以及 对同一个域名下的总 cookie 数量也有限制 (20 个)
  • 作用:
    1. cookie 一般用于存出少量的不太敏感的数据
    2. 在不登录的情况下,完成服务器对客户端的身份识别

JSP 入门

概念

  • Java Server Pages: java 服务器端页面
    • 可以理解为:一个特殊的页面,其中既可以指定定义 html 标签,又可以定义 java 代码
    • 用于简化书写!!!

原理

JSP 本质上就是一个 Servlet

JSP 的脚本

JSP 定义 Java 代码的方式

  1. <% 代码 %> :定义的 java 代码,在 service 方法中。service 方法中可以定义什么,该脚本中就可以定义什么。
  2. <%! 代码 %> :定义的 java 代码,在 jsp 转换后的 java 类的成员位置。
  3. <%= 代码 %> :定义的 java 代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

JSP 的内置对象

  • 在 jsp 页面中不需要获取和创建,可以直接使用的对象

  • jsp 一共有 9 个内置对象

    • request

    • response

    • out:字符输出流对象。可以将数据输出到页面上。和 response.getWriter() 类似

      response.getWriter()out.write() 的区别:

      • 在 tomcat 服务器真正给客户端做出响应之前,会先找 response 缓冲区数据,再找 out 缓冲区数据。
      • response.getWriter() 数据输出永远在 out.write() 之前

Session

概念

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession

快速入门

  1. 获取 HttpSession 对象:

    HttpSession session = request.getSession();

  2. 使用 HttpSession 对象:

    Object getAttribute(String name)
    void setAttribute(String name, Object value)
    void removeAttribute(String name)

  3. 原理

Session 的实现是依赖于 Cookie 的。

2020-06-19T002012

细节

当客户端关闭后,服务器不关闭,两次获取 session 是否为同一个

  • 默认情况下。不是。
  • 如果需要相同,则可以创建 Cookie, 键为 JSESSIONID,设置最大存活时间,让 cookie 持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);

客户端不关闭,服务器关闭后,两次获取的 session 是同一个吗

  • 不是同一个,但是要确保数据不丢失。tomcat 自动完成以下工作
    • session 的钝化:
      • 在服务器正常关闭之前,将 session 对象系列化到硬盘上
    • session 的活化:
      • 在服务器启动后,将 session 文件转化为内存中的 session 对象即可。

session 什么时候被销毁

  1. 服务器关闭

  2. session 对象调用 invalidate()

  3. session 默认失效时间 30 分钟

    选择性配置修改

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

session 的特点

  1. session 用于存储一次会话的多次请求的数据,存在服务器端
  2. session 可以存储任意类型,任意大小的数据
  1. session 存储数据在服务器端,Cookie 在客户端
  2. session 没有数据大小限制,Cookie 有
  3. session 数据安全,Cookie 相对于不安全

转载规则

《Cookie 和 Session》Konata 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
  目录