• 会话和会话状态


    一、会话概述

    1)现象:HTTP协议是一种无状态的协议,Web服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。

    2)解决:借助会话状态,Web服务器能够把属于同一会话中的一系列请求和响应过程关联起来。

    3)实现:需要浏览器对其发出的每个请求消息都进行标识。这个标识称为会话ID(SessionID)。

    二、Cookie

    1. 概述

    1)机制:采用在客户端保持HTTP状态的方案。浏览器访问服务器时,由服务器在HTTP响应消息头中附带一个传送给浏览器的小文本文件。之后浏览器每次访问服务器时,都会在HTTP请求头中将这个 Cookie 回传给服务器。

    2)原理:服务器通过在HTTP响应消息中增加 Set-Cookie 响应头字段将 Cookie 信息发送给浏览器,浏览器则通过在HTTP请求消息中增加 Cookie 请求头字段将 Cookie 回传给服务器。

    2. 创建Cookie

    方法签名:

    • Cookie(String name, String value)  //构造器
    • void setMaxAge(int maxAge)         //设置 Cookie 的最大时效, 以秒为单位。

                                                                       若为 0 , 表示立即删除该 Cookie;

                                                                       若为负数, 表示不存储该 Cookie;

                                                                       若为正数, 表示该 Cookie 的存储时间。

    • void addCookie(Cookie cookie)           //把Cookie加入到响应中
    //1. 创建一个 Cookie 对象
    Cookie cookie = new Cookie("name", "atguigu");
    //2. 设置 Cookie 的最大时效 cookie.setMaxAge(30); //3. 调用 response 的一个方法把 Cookie 传给客户端. response.addCookie(cookie);

    3. 获取Cookie

    方法签名:

    • Cookie[] getCookies()  //获得这次请求中的全部Cookie
    • String getName()         //获得当前Cookie的名字
    • String getValue            //获得当前Cookie的值
    //1. 获取 Cookie
    Cookie [] cookies = request.getCookies();
    if(cookies != null && cookies.length > 0){
        for(Cookie cookie: cookies){
            //2. 获取 Cookie 的 name 和 value
            out.print(cookie.getName() + ": " + cookie.getValue());
        }
    }

    4. Cookie的作用范围

    1)默认范围:可以作用当前目录和当前目录的子目录. 但不能作用于当前目录的上一级目录。

    2)解决方案:可以通过 setPath 方法来设置 Cookie 的作用范围, 其中 / 代表站点的根目录。

    Cookie cookie = new Cookie("cookiePath", "CookiePathValue");
    //设置 Cookie 的作用范围:
    cookie.setPath(request.getContextPath());  
    response.addCookie(cookie);

    三、HttpSession

    1. 概念

    1)含义:在Web开发环境中,session 是指一类用来在客户端与服务器之间保持状态的解决方案。有时候也用来指这种解决方案的存储结构。

    2)机制:采用在服务器端保持HTTP状态信息。

    3)原理:

    • 创建一个 session 时先检查这个客户端的请求里是否包含了一个 session 标识(即sessionID),即请求里是否存放了名为"JESESSIONID",值为 sessionID 的 cookie
    • 若已存在就检索出来使用,
    • 否则为此客户创建一个 session,并生成一个与此 session 相关联的 sessionID,用 set-cookie 方式传递给请求,那么下一次请求发出时,就会使用此 sessionID 作为 cookie 中名为"JESESSIONID"的值进行传递 sessionID。

    4)保存方式:最常用的是用 cookie 保存。但如果 cokkie 被禁用,必须有其他机制进行保存。如URL重写:把 sessionID 附加在URL路径后面。

    5)注意:由于是通常是用 cookie 来保存的,所以如果让 cookie 持久化就可以在重启浏览器后也能获取到该 sessionID。

    //用持久化cookie保存sessionID
    Cookie cookie = new Cookie("JESESSIONID",session.getId());
    cookie.setMaxAge(20);
    response.addCookie(cookie);

    2. Session的创建

    1) Session 属性

    • 若 page 指定的 Session 属性默认为 true,那么 第一次访问一个 WEB 应用的一个 JSP 页面时,该页面都必须有一个和这个请求相关联的 Session 对象。
    • 否则JSP 页面不会要求一定有一个 Session 对象和当前的 JSP 页面相关联,所以第一次访问JSP页面时不会创建一个 Session。

    2)request.getSession(boolean flag):

    • true,则一定会返回一个 HttpSession 对象,如果已经有和当前 JSP 页面关联的 HttpSession对象,直接返回;如果没有,则创建一个新的返回。
    • false,则若没有和当前JSP页面关联的 HttpSession 对象返回null,否则返回取得的HttpSession对象。
    • request.getSession() 相当于 request.getSession(true)。

    3. Session对象的销毁

    1)调用HttpSession 的 invalidate()方法。

    2)HttpSession 超过过期时间自动销毁,可以在 Tomcat 的 web.xml 文件中配置 Session 的最大时效, 单位是分钟。

    <!-- apache-tomcat-x.x.xxconfweb.xml -->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

    相关方法签名:

    • int getMaxInactiveInterval()                         //返回最大时效,单位:秒
    • void setMaxInactiveInterval(int interval)      //设置最大时效

    3)服务器卸载当前 WEB 应用。

    4.Session相关方法

    String getId()                                                       //得到sessionID

    boolean isNew()                                                  //该session是不是新创建的

    long getCreationTime()                                       //该session被创建的时间

    long getLastAccessedTime()                              //该session最后一次被访问的时间

    void setAttribute(String key, Object value)         //存放值,相当于哈希表

    Object getAttrbute(String key)                           //根据键从session中取得对应的值

    5.URL重写实现Session跟踪

    方法签名:String encodeURL(String url)  //该方法会在URL后面加上sessionID

    <!-- JSP中 -->
    <
    a href="<%= response.encodeURL("login.jsp") %>">重新登录</a>
    <!-- 网页源文件 -->
    <
    a href="login.jsp:jsessionid=5D47F6A9A12A34CC4383E23D927982CF">重新登录</a>
  • 相关阅读:
    【每日一题】16.Treepath (LCA + DP)
    M-SOLUTIONS Programming Contest 2020 游记 (AB水题,CD模拟,E题DFS)
    关于“Github上传以及Clone时发生的 Failed to connect to github.com port 443: Timed out 问题解法记录
    【离散数学】学习笔记目录
    【每日一题】15.Xorto (前缀和枚举)
    【动态规划】动态规划基础 (OI wiki)
    【每日一题】14.Accumulation Degree(树形DP + 二次扫描)
    AtCoder Beginner Contest 199 游记(AB水题,C字符串操作,D搜索,E状压)
    JXUST_NC
    LinkedList源码阅读笔记
  • 原文地址:https://www.cnblogs.com/CComma/p/7173167.html
Copyright © 2020-2023  润新知