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的超时指客户端两次请求的最大间隔时长。


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,服务器可以在浏览器端存储和读取数据,从而实现用户的身份验证和会话管理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容