不冷博客

会话控制技术和Cookie-12月15日讲课内容

会话控制技术

什么是会话

此处的是指客户端(浏览器)和服务端之间的数据传输。例如用户登录,购物车等。

会话控制就是管理浏览器客户端和服务端之间会话过程产生的会话数据。

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

    • 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
  2. 功能:在一次会话的范围内的多次请求间,共享数据

为什么要使用会话控制

1、因为HTTP协议连接是一个无状态连接
    例如:
        1. 服务器端数据更新,页面更换,如果浏览器不重新访问请求,是不可能获取到新的内容,这就是一种【无状态的表现】
        2. 所以浏览器每一次访问服务器,服务器是无法知道当前浏览器访问之前做过什么,不管是浏览器,还是服务器都没有对数据进行保存
        
2、WEB Application 会话过程中,需要管理和操作的就是在浏览器和服务器直接交互过程中,产生的状态信息,这里可以利用会话控制技术,保存一些浏览器和服务器交互的核心数据。

3、会话控制技术可以减少浏览器请求的次数,同时降低服务器处理业务逻辑的压力。并且可以将浏览器的请求和服务器的响应连接在一起。

核心操作技术

Cookie
    浏览器端保存会话数据的方式
    
Session
    服务器保存会话数据的方式

Cookie

概述

客户端会话技术,将数据保存到客户(浏览器)端

Cookie 是浏览器保存访问 WEB Application 时留存的会话数据。服务器会在浏览器访问指定的资源时,使用响应头发送一定的 Cookie 信息给浏览器进行保存,浏览器会存储对应的 Cookie 数据,并且在下一次访问对应的WEB Application 自动带上对应的 Cookie 数据进行访问资源。

   1. Cookie 数据是通过 Response 响应对象从 WEB Application 接收
       
   2. Cookie数据会随着 Request 请求对象从浏览器传递到对应的WEB Application

特点

1、一次可以发送多个Cookie

2、Cookie 在浏览器中保存多长时间

1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
2. 持久化存储:
   void setMaxAge(int seconds)
   1. 正数:将Cookie数据写到硬盘的文件中,持久化存储。并指定cookie存活时间,时间到后,Cookie自动失效
   2. 负数:默认值
   3. 零:删除cookie信息

3、Cookie 能不能存中文?

在 Tomcat8 之前Cookie中不能直接存储中文数据。需要将中文数据转码---一般采用URL编码(%E3)

在 Tomcat8 之后Cookie支持中文数据,特殊字符还是不支持。但是使用时需要用URL编码存储,URL解码解析。不建议使用Cookie存储中文

4、Cookie 的数量和大小限制

浏览器保存Cookie个数总数限制 300 
单一站点限制Cookie个数 20
单一Cookie数据大小 4KB以内
单一Cookie是键值对形式,有 name 和 value

5、Cookie 的共享

1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
   1、默认情况下cookie不能共享
   2、setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录。如果要共享,则可以将path设置为"/"

2. 不同的tomcat服务器间cookie共享问题?
   1、setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
   2、setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享

6、作用:

1. cookie一般用于存储少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别

常用方法

// 【重点】创建一个Cookie
Cookie(String name, String value);
    
// 设置Cookie的有效路径
void setPath(String path);
   
// 【重点】设置当前Cookie的有效时间
// 正数 大于0 有效时间,保存在浏览器本地磁盘中,时间Timeout自动销毁
// 负数 小于0 浏览器未关闭之前有效,内存存储Cookie
// 0 等于0 销毁Cookie
void setMaxAge(int time);
 
// 获取当前请求头中所有的Cookie数据数组【调用者为Request对象】
Cookie[] getCookies();  

// 【重点】通过Response响应对象发送Cookie数据到浏览器【调用者为Response对象】
void addCookie(Cookie cookie);

【注意】

Cookie路径限制是为了约束当前Cookie在访问那些资源时带有对应的Cookie数据
   1. 如果是默认情况下,没有自定义约束当前Cookie数据有效路径,默认是当前项目
   2. 设置有效路径为setPath("/") 表示整个Tomcat服务器有效
   3. /FC2020/admin 指定Cookie有效路径,就是URL匹配路径,在一定范围内有效,可
   以提高Cookie数据使用的安全性

使用

  1. 创建Cookie对象,绑定数据
  2. 发送Cookie对象
  3. 获取Cookie对象,拿到数据

案例代码

创建

/**
 * 测试创建 cookie
 */
@WebServlet("/createCookie")
public class CreateCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        // 获取 Cookie 对象
        Cookie cookie = new Cookie("name", "Lucy");

        // 设置过期时间
        cookie.setMaxAge(60);

        // 设置有效路径(整个 web 项目)
        cookie.setPath("/");

        // 发送到浏览器
        response.addCookie(cookie);

        System.out.println(cookie.getName() + ":" + cookie.getValue());
    }
}

获取

/**
 * 测试获取Cookie
 */
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从HttpServletRequest对象中获取浏览器请求服务器带有的Cookie数据
        Cookie[] cookies = req.getCookies();
        
        for (Cookie cookie : cookies) {
            // 获取Cookie的名字和Cookie的值
            System.out.println(cookie.getName() + ":" + cookie.getValue());
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

销毁

/**
 * 测试销毁 Cookie
 */
@WebServlet("/destroyCookie")
public class DestroyCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        // 获取浏览器上的 cookie 数据
        Cookie[] cookies = request.getCookies();

        // 遍历数组
        for (Cookie cookie : cookies
        ) {
            // 将 cookie 的有效期置为 0
            cookie.setMaxAge(0);
            // 将 cookie 发送到浏览器
            response.addCookie(cookie);
        }
    }
}

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »