什么是Session?

Posted kongsam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是Session?相关的知识,希望对你有一定的参考价值。

Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为session id,如果客户端的请求中不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,这个 session id将被在本次响应中返回给客户端保存。

保存这个session id的方式可以采用Cookie技术,这样在交互过程中浏览器可以把这个标识发回给服务器。

什么是Session

Cookie技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享,但是如果请求需要传递的信息比较多,使用Cookie技术就会增大请求的难度。

Session可以存储对象、数组、文本等信息,可以见得Session能够存储大量的数据,而且Session是存储到服务器一端的,Cookie是由服务器发送一段信息给客户端,由客户端存储在浏览器缓存区中的。

Cookie的工作原理以及讲解请见:什么是Cookie?

Session如何工作

在现实生活中,当你去理发店理发时,你可以选择在前台办理一张会员卡,前台工作人员将你的基本信息和之后的消费信息等都存储到店家电脑的硬盘上,在以后消费的时候你仅凭一张会员卡就可以查询到你所有的信息和消费记录。注意,这里的你是指客户端,前台(店家)指的是服务端。

image-20210516004518786

Session技术是将信息保存在服务端,而客户端需要接收、记录和回送Session的ID,所以Session通常情况下是借助Cookie技术来传递ID给服务端的,服务端拿到session id之后查询内存中对应的记录。

代码实例

编写一个Servlet类用于创建一个Session,并在Session中存储一个User对象,在响应客户端之前自动创建一个key为JSESSIONID,value为与此Session相关联的session id的Cookie,然后在本次响应中返回给客户端保存。

@WebServlet(name = "sessionDemo01", urlPatterns = "/week10/session01")
public class SessionDemo01 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获得Session
        HttpSession session = req.getSession();
        // 设置Session
        session.setAttribute("user", new User(1, "kongsam"));
    }
    
}

访问第二个Servlet类来获取名为user的Session对象

@WebServlet(name = "sessionDemo02", urlPatterns = "/week10/session02")
public class SessionDemo02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获得Session
        HttpSession session = req.getSession();
        // 获得Session的user
        User user = (User) session.getAttribute("user");
        resp.getWriter().write(user.toString() + "  sessionId = " + session.getId());
    }
    
}

获取到Session对象之后,在前端控制台中application一项呈现的结果

可以看到一个key为JSESSIONID,value为9D....的Cookie对象,并且在"localhost:8080/zrf"及下层的url都可以访问到该Cookie对象。

在本次请求,即"localhost:8080/zrf/week10/session02"请求中,会携带"9D...."的session id给服务端,然后服务端检索对应的Session,刚好对应了之前请求创建的Session对象,所以才能输出图中的文本信息。

以上是关于什么是Session?的主要内容,如果未能解决你的问题,请参考以下文章

一个队asp.net session进行了再次封装的C#类的代码

redis存储session配制方法

C# 最有用的(自定义)代码片段是啥? [关闭]

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

有人知道下面的代码片段是啥意思吗?

iphone / Objective c的最佳代码片段网站是啥[重复]