美文网首页JavaWeb
Cookie和Session会话跟踪

Cookie和Session会话跟踪

作者: h2coder | 来源:发表于2022-11-16 20:52 被阅读0次

    什么是会话

    image-20221019192550392.png
    • 用户打开浏览器,访问服务器的某个资源,就会建立会话,直到有一方断开连接,例如浏览器关闭,服务器重启等,就会会话结束。一次会话中可以包含多次请求和响应。

    问题

    由于Http是无状态的,无论浏览器发送多少次请求,服务器都会将该请求当成一个新的请求,所以需要使用会话跟踪技术来解决这个问题。

    Cookie和Session

    • Cookie:客户端会话跟踪技术
    • Session:服务端会话跟踪技术

    Cookie

    image-20221019192900673.png
    • Cookie,客户端会话跟踪技术,将数据保存到浏览器,以后每次请求都带上Cookie数据进行访问

    Cookie的基本使用

    • 发送Cookie

    浏览器发送请求到服务端,服务端将Cookie发送给浏览器

    //创建Cookie
    Cookie cookie = new Cookie("key", "value");
    //发送Cookie
    response.addCookie(cookie);
    
    • 获取Cookie

    后续浏览器的每次请求,都会带上Cookie数据,那么服务端就可以从请求中获取Cookie数据,

    //获取Cookie数组
    Cookie[] cookies = request.getCookies();
    //遍历每个Cookie,获取每个Cookie的键和值
    for (Cookie cookie : cookies) {
        //Cookie的键
        String name = cookie.getName();
        //Cookie的值
        String value = cookie.getValue();
        System.out.println("Cookie key=" + name + ",value=" + value);
    }
    

    Cookie的原理

    Cookie是基于HTTP协议实现的

    • 浏览器请求服务端,服务端生成Cookie,并在响应头中设置响应头:set-cookie
    • 浏览器从响应头中获取Cookie,在后续的请求中,都设置一个cookie请求头,传递给服务端获取
    image-20221019193236615.png

    在浏览器中,查看Cookie

    image-20221019193318254.png

    Cookie使用细节

    Cookie的存活时间

    默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,Cookie就会销毁,但也可以设置Cookie的存活时间,来控制Cookie存活

    • cookie.setMaxAge(int seconds);,传入的参数为存活时间,单位为秒
      • 正数,代表Cookie将持久化存储在浏览器所在的磁盘中,到期自动删除
      • 负数,默认值,代表Cookie将存储在浏览器的内存中,关闭浏览器则销毁
      • 零,设置Cookie立即过期

    Cookie存储问题

    • 如需要在 Cookie 空格或中文,需要进行URL编码
    • Tomcat-7 Cookie 不能直接存储中文,Tomcat8 则可以存储中文,但不能存储空格
    • 所以需要存储空格或中文,都需要进行URL编码,获取时进行URL解码
    String name = "张 三";
    //URL编码
    name = URLEncoder.encode(name, "UTF-8");
    //创建Cookie
    Cookie cookie = new Cookie("name", name);
    //发送Cookie
    response.addCookie(cookie);
    
    //获取Cookie
    Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
        //Cookie的键
        String name = cookie.getName();
        //Cookie的值
        String value = cookie.getValue();
        //URL解码,可能会存在空格和中文
        value = URLDecoder.decode(value, "UTF-8");
        System.out.println("Cookie key=" + name + ",value=" + value);
    }
    

    Session

    • Session,服务端会话技术,将数据保存到服务器
    image-20221019193748204.png
    • JavaEE 提供 HttpSession接口,来实现一次会话的多次请求间数据共享功能

    Session的使用

    //获取Session
    HttpSession session = request.getSession();
    
    //存储数据到Session
    session.setAttribute("sname", "lisi");
    
    //从Session中获取数据
    Object sname = session.getAttribute("sname");
    
    //删除Session指定名称的数据
    session.removeAttribute("sname");
    

    Session的原理

    Session基于Cookie实现的

    image-20221019193840691.png
    • 浏览器发出请求到服务端,服务端创建Session,并且把Session的Id,JSESSIONID返回给浏览器,浏览器将id存储到Cookie中
    • 浏览器后续发出的请求,都会将这个JSESSIONID,通过Cookie发送给服务端,服务端根据这个id获取Session对象,通过对象获取数据

    Session的使用细节

    • 服务器重启后,Session中数据是否还存在?

      • 钝化,服务器关闭后,Tomcat会自动将Session数据持久化到磁盘中
      • 活化,服务器再次启动,Tomcat会将磁盘中的Sessions数据恢复
    • 注意:

      • 如果是IDEA中集成Tomcat需要勾选配置 Preserve sessions across restarts and redeploys
    image-20221019194156663.png
    • 如果是直接部署到Linux系统上,则不需要进行配置,Tomcat会默认开启钝化和活化

    • Session的销毁

      • 默认,30分钟无操作,Session将会被自动销毁,如需更改,则要在web.xml中进行配置
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">
    
        <!-- session的最大存活时间,单位为分钟,默认为30分钟 -->
        <session-config>
            <session-timeout>5</session-timeout>
        </session-config>
    </web-app>
    

    Cookie和Session的对象

    • 相同点
      • Cookie和Session,都是在同一个会话中,用来进行多个请求间的数据共享的
    • 区别
      • 键值对数量:一个Cookie对象只能保存一个键和一个值,而Session可以保存多个键和多个值
      • 存储位置,Cookie存储在客户端,Session存储在服务端
      • 安全性:Cookie不安全,Session安全
      • 数据大小:Cookie最大4kb,Session没有大小限制
      • 存储时间:Cookie默认浏览器关闭则销毁,Session默认30分钟无操作则过期
      • 是否占用服务器资源:Cookie不占用服务端资源,Session占用服务端资源

    相关文章

      网友评论

        本文标题:Cookie和Session会话跟踪

        本文链接:https://www.haomeiwen.com/subject/eryexdtx.html