JavaWeb 15 Session 讲解

5.7 Session 讲解(重点)


什么是Session:

我们 一般认为,Session 是一个 数据表,由 服务端 自动生成。你可以 在 谷歌浏览器 的 Cookies 中 找到 这个自动生成 的 Cookie 名字叫做 ‘JSESSIONID’ 切记:这个 cookie 只用来 只是用来 存放 session ID 的,据说是可以 辅助 客户端 找到 服务器端的那个 session。在文章 后续 会有个 获取 session 的 API 在那里会对其进行解释
在这里插入图片描述
那么Session 到底 在哪呢 ? 答:在 服务器 WEB 程序的 内存中。

  • 服务器会给每一个用户(浏览器)自动的创建一个 Seesion 对象。存在 程序内存 中。
  • 一个 Seesion 独占一个浏览器,只要浏览器没有关闭,这个Session 就存在。多个浏览器就可以有多个Seesion。
  • 比如说:用户登录之后,就会保存用户的信息,那么对于该网站相关的请求都可以访问(可能会根据Session进行有效访问)。

我们之前学习 cookie ,知道 cookie 这个东西,客户端可能是没有的,如果没有!我们就需要 从 服务端 新建一个 cookie 然后添加到 客户端(怎么添加呢?直接 resp 响应到 浏览器即可)。但是 session 却是 服务端自己自动生成的。只要会话成功建立,session 就会自动生成!不需要我们 人为的进行判断。和建立。

session一般用来干什么:如果说 会话一旦成功建立,session 就会生成的话。那么它的作用在于什么呢 ?

答:Session 虽然 只存在于 服务端,但它可以 根据各种网络协议和客户端进行通讯。并且它还类似于 一个 记录的数据表,当然如果你学过 json 的话,也可以把它理解为 json 的数据结构。它在 存储数据的时候 就是按照键值对来的,而每一个键值对,又都对等于 一个 cookie,当然 它 却不是 cookie !!不过呢,无论是 cookie 还是 session 如果想让其 有真实的意义,我们就必须要 存一些我们需要的密钥信息。

从上述可以知道,本质上 cookie 和 session 都是在干同一件事!!!它们只不过是在 存储 关键信息的时候略有不同,都是 辅助我们开发 web app 用的。最明显的例子 在于 cookie 和 session 在存储 关键信息的时候 都会在 后台程序里 进行 添加。 **即它们两个都要从后台的服务端进行处理。所以不要想的太复杂。你只要记住 seesion 这个东西 是服务端自动生成的,存储信息的方式 是 json 添加键值对 就完事了。

这里需要注意的是:cookie 只能够 存储字符串,而 session 它是满足键值对的,那么就能够存储 任何数据。

  • 好了,我们现在又有一个问题:服务器把他自动生成了之后,我们又 怎么去找到 这个 session 呢 ?

答:可以通过 后端程序的 API 呀,既然 我们 在开发 WEB 程序,那肯定 就有 关于 Session 的API,而在此时,你可能 就会发现 Java 的 Servlet 有点儿 怪了,它是 通过 req.getSession() 对 Session 进行获取的。官方的解释是说 客户端向服务器 发送 获取 Session 的请求。我的理解是 因为 Session 很多,我们不能够直接 取出来。必须 根据 当前的客户端,Cookies 里面 存储的 SessionID 来 发送 给 服务端,这样 服务端 就可以 根据这个 ID 找到 对应的 Session!

  1. 验证session 是自动生成的!

session.isNew(); 判断 session 是否是第一次生成
session.getId(); 获取到 该 session 的 ID 唯一标识

package com.muqanyu.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

public class SessionDemo01 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");

        //客户端向 服务端发送 获取 Session 的请求,由此可见 Session 是存储在服务端的。
        HttpSession session = req.getSession();
        session.setAttribute("name", "哞哞");

        String sessionId = session.getId();

        if (session.isNew()) {
            resp.getWriter().write("session创建成功 ID:"+sessionId);
        }else{
            resp.getWriter().write("session已经在服务器中存在了 ID:"+sessionId);
        }
        //super.doGet(req, resp);
    }

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

在这里插入图片描述

你会发现浏览器 一打开,就有 所谓的 Session ID,也就证明了 Session 是存在的。并且 cookies 中 确实 也把 这个 ID 作为 cookie 存储进去了。

  1. 获取Session 里面存储的信息
package com.muqanyu.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        HttpSession session = req.getSession();
        Object name = session.getAttribute("name");

        resp.getWriter().write("获取到session 里面的 name:"+ name);


        //super.doGet(req, resp);
    }

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

如果 没有 setAttribute() 的话,是取不到的。
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
3. 删除session 节点 和 注销session

删除节点还有点儿用,但是 注销 session 简直就很滑稽。。session 即使注销掉了,也会 再次 生成。只不过 是 里面的信息 全部 被清空了 而已。

package com.muqanyu.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

public class SessionDemo03 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");

        HttpSession session = req.getSession();
        session.removeAttribute("name");
        
        //手动注销 sesssin
        //session.invalidate();
       
        //super.doGet(req, resp);
    }

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也可以在 web.xml 里面 设置 session 的 配置 来 决定 session 多久 刷新一次。

<session-config>
        <session-timeout>1</session-timeout>
</session-config>

上述 就是 一分钟 刷新一次 session。

  1. 使用场景
  • 保存一个登录用户的信息。
  • 购物车的信息。
  • 在整个网站中 经常会使用到的数据,我们必须保存在 Session 中。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值