当前位置: 首页>后端>正文

JavaWeb开发教程之Session的使用

什么是Session?

Session在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将终止该会话。

Session在专业术语中,是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。

在Java Web开发中,Session是一种用于跟踪用户会话的对象。通过使用Session,可以存储和检索与特定用户会话相关的数据。以下是在Java Web中使用Session的一些常见用法:

  1. 存储数据:Session对象可以存储任何类型的对象,例如字符串、整数、集合等。在用户访问Web应用程序时,可以在Session中存储数据,以便在多个页面之间共享数据。例如,可以在用户登录时将用户信息存储在Session中,以便在用户访问其他页面时仍然可以访问这些信息。
  2. 检索数据:可以通过Session对象的get方法检索存储在其中的数据。例如,可以使用以下代码从Session中获取名为"username"的数据:
String username = (String) session.getAttribute("username");
  1. 设置超时时间:可以通过设置Session的超时时间来控制会话的持续时间。如果用户在指定的超时时间内没有活动,则Session将自动失效。例如,以下代码将设置Session的超时时间为30分钟:
session.setMaxInactiveInterval(30 * 60); // 30分钟
  1. 销毁Session:当不再需要Session时,可以使用Session的invalidate方法销毁它。这将删除Session中存储的所有数据,并使Session失效。例如:
session.invalidate();

需要注意的是,使用Session时应该遵循最佳实践,并注意保护用户的隐私和数据安全。例如,应该避免将敏感信息存储在Session中,并使用安全的会话管理方法来保护会话数据。

在JavaWeb开发中:

  • Session是一个接口(HttpSession)
  • Session就是会话;它是维护客户端与服务器之间关联的一种技术
  • 每个客户端都有自己的一个Session
  • Session会话经常用来保存用户登录后的信息

案例实操

session的创建的与获取

如何创建和获取 Session。它们的 API 是一样的。
request.getSession()
第一次调用是:创建 Session 会话
之后调用都是:获取前面创建好的 Session 会话对象。

isNew() 判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建

每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
getId()得到 Session 的会话 id 值。

/**
 * @author: lisong
 * @createTime: 2023-08-02 16:00 星期三
 * @description:
 */
public class SessionServlet extends HttpServlet {

    //session的创建和获取
    protected void createSession(HttpServletRequest req, HttpServletResponse resp) throws       ServletException, IOException {
        //1. 获取客户端Session会话,没有服务器则自动创建
        var session = req.getSession();
        //2. 判断当前Session是否第一次创建
        boolean isNewSession = session.isNew();
        //3. 获取当前Session的唯一标识
        var id = session.getId();
        resp.getWriter().write("Session["
                + "当前session是否第一次创建:" + isNewSession + "<br/>" + "当前session唯一标识:" + id + "]");
    }
}

Session 域中数据的存取

//向session域中存取数据
protected void setSessionScope(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     //向session域中保存数据
     req.getSession().setAttribute("key1","value1");
     //获取session域中数据
     var sessionVal = req.getSession().getAttribute("key1");
     System.out.println("获取session域中数据:" + sessionVal);
     resp.getWriter().write("key1的session的value值:" + sessionVal);
    }

Session 生命周期控制

  • public void setMaxInactiveInterval(int interval):设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。

    • 值为正数的时候,设定 Session 的超时时长。
    • 负数表示永不超时(极少使用)
  • public int getMaxInactiveInterval():获取 Session 的超时时间

  • public void invalidate(): 让当前 Session 会话马上超时无效。

Session 默认的超时时间长为 30 分钟。 因为在 Tomcat 服务器的配置文件 web.xml中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长为:30 分钟。

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

修改默认的 Session 的超时时长为其他时长,可以在 web.xml 配置文件中做以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长。

<!-- 修改当前web工程创建出来的所有session默认为10分钟超时时长 -->
<session-config>
    <session-timeout>10</session-timeout>
</session-config>

如果只修改个别 Session 的超时时长。就可以使用上面的 API。setMaxInactiveInterval(int interval)来进行单独的设置。 session.setMaxInactiveInterval(int interval)单独设置超时时长。

//设置当前session超时时长
public void updateSession(HttpServletRequest request,HttpServletResponse response) throws IOException {
    //获取Session对象
    HttpSession session = request.getSession();
    //设置当前Session 5秒后超时
    session.setMaxInactiveInterval(5);
    //响应给客户端输出
    response.getWriter().write("当前Session5秒后超时");
}

//设置当前session马上超时
public void updateSession(HttpServletRequest request,HttpServletResponse response) throws IOException {
    //获取Session对象
    HttpSession session = request.getSession();
    //设置当前Session马上超时
    session.invalidate();
    response.getWriter().write("当前Session设置为超时(无效)");
}

Session的超时概念

session的超时指客户端两次请求的最大间隔时长。


JavaWeb开发教程之Session的使用,第1张
Session超时时长间隔的过程
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
    // 先获取 Session 对象
    HttpSession session = req.getSession();
    // 设置当前 Session3 秒后超时
    session.setMaxInactiveInterval(3);
    resp.getWriter().write("当前 Session 已经设置为 3 秒后超时");
}

//设置Session马上被超时
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
    // 先获取 Session 对象
    HttpSession session = req.getSession();
    // 让 Session 会话马上超时
    session.invalidate();
    resp.getWriter().write("Session 已经设置为超时(无效)");
}

浏览器与Session之间的底层原理

Session底层基于Cookie实现的。

当用户在浏览器中访问一个Web应用程序时,浏览器会向服务器发送HTTP请求。客户端(浏览器)首次发送请求时,没有创建Cookie,服务器收到请求后会为该用户创建一个Session对象,并为其分配一个唯一的Session ID。通过响应把新创建出来的Session ID返回给客户端,客户端解析收到的数据,马上创建了一个Cookie对象,这个Session ID会被存储在Cookie中。当第二次及以后每次发送请求,都会把Session ID以Cookie的形式发送给服务器,服务器就可以通过Cookie中Session ID值找到自己创建的Session对象并返回。
假如Cookie被删除就相当于Session对象也被删除,此时当你在获取Session对象时就需要向上面一样,重复首次发送没有Cookie的请求过程。
Cookie形式Cookie: JSESSIONID=F78BC66D93215A011033CC65CB85E92A(这个值就是Session的ID)

浏览器、Session和Cookie之间的执行过程

用户通过浏览器访问web网站进行用户登录,描述浏览器、Session和Cookie之间的执行过程:

  1. 浏览器向服务器发送HTTP请求,获取登录页面。
  2. 服务器响应请求,返回登录页的HTML。
  3. 用户在登录页输入用户名和密码,点击登录。
  4. 服务器接收到登录请求后,会创建一个Session对象,并在其中存储用户相关的数据,例如用户ID等。
  5. 服务器为该Session生成一个唯一的标识符(Session ID),并在响应中以Cookie的形式将Session ID发送给浏览器。
  6. 浏览器收到Cookie后,将其存储在本地。
  7. 当用户再次访问服务器时,浏览器会将包含Session ID的Cookie发送回服务器。
  8. 服务器接收到请求后,解析请求中的Cookie,提取出Session ID。
  9. 服务器根据Session ID找到对应的Session对象,从中取出相关数据,以实现用户的会话跟踪。

在整个过程中,Session和Cookie起到了重要的角色。通过Session,服务器可以跟踪用户的会话状态,而通过Cookie,服务器可以在浏览器端存储和读取数据,从而实现用户的身份验证和会话管理。


https://www.xamrdz.com/backend/3gq1936323.html

相关文章: