当前位置: 首页 > 图灵资讯 > 技术篇> 关于B/S结构系统的会话机制

关于B/S结构系统的会话机制

来源:图灵教育
时间:2023-06-02 09:27:42

1.什么是会话?42

-会话对应的英语单词:session

-用户打开浏览器,进行一系列操作,然后最终关闭浏览器。整个过程称为:会话。服务器端还有一个相应的java对象,称为:session。

-什么是一个请求:用户点击浏览器,然后停止到页面,大致可以被视为一个请求。服务器端的java对象为:request。

-一次会话包含多个请求。(一次会话对应N个请求。)

在javaservlet规范中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession)

-session机制是B/S结构的一部分。如果使用图灵语言开发WEB项目,也有session机制。session机制实际上是一个标准。然后实现不同语言的会话机制。

1.1session的主要功能是42

-session对象的主要功能是保存会话状态。(用户成功登录,这是一种成功登录状态。如何保存成功登录状态?使用session对象可以保持会话状态。)

2.为什么需要session对象来保存会话状态?42

-因为HTTP协议是无状态协议。

-什么是无状态:请求时,B和S连接,但请求结束后,连接断裂。

2.1为什么要这样做?为什么HTTP协议要这样设计?

因为这种无状态协议可以降低服务器的压力。请求的瞬间是连接的,请求结束后,连接断开,使服务器压力小。

2.1.只要B和S断开,服务器知道关闭浏览器的动作吗?

-不知道。服务器不知道浏览器是关闭的。

-张三打开浏览器A,李四打开浏览器B,访问服务器后,在服务器端生成:

-张三独家session对象的session

-李四专属sessionsession对象

2.1.为什么不使用request对象来保存会话状态?为什么不使用servletcontext对象来保存会话状态?42

-request.setAttribute()存,request.getAttribute()取,Servletcontext也有这种方法。request是请求域。servletcontext是应用域。

-request是一次请求一个对象。

-Servletcontext对象是在服务器启动和服务器关闭时创建的,只有一个Servletcontext对象。

-Servletcontext对象域太大。

-request请求域域(HttpServletRequest)、sesssion会话域域(HttpSession)、application域域(ServletContext)

-request<session<application

3.思考:session对象的实现原理。42

-HttpSessionsession=request.getSession();

-这个代码很神奇。张三访问时获得的session对象是张三的。李四访问时获得的session对象是李四的。

关于B/S结构系统的会话机制_服务器

com中的代码.bjpowernode.javaweb.servlet.42TestsessionServetet包

package com.bjpowernode.javaweb.servlet;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import jakarta.servlet.http.HttpSession;import java.io.IOException;import java.io.PrintWriter;///解释session机制  42@WebServlet("/test/session")public class TestSessionServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        // 服务器端的java对象是request和session。都在JVM中。都在JVM中。        // request对象代表一个请求。(一次请求对应一个request对象。两个请求将对应两个不同的request对象。)        // session对象代表会话。(一次会话对应一个session对象。)        // 获得session对象的session        // 从WEB服务器当中获得session对象的session,如果session对象没有,则新建。        HttpSession session = request.getSession();        // 将数据绑定到会话域。        // session.setAttribute();        // 从会话域中获取数据。        // Object obj = session.getAttribute()        ////将session对象对应到浏览器        response.setContentType("text/html;charset=UTF-8");        PrintWriter out = response.getWriter();        ////想看对象的内存地址        ///会话对象=org.apache.catalina.session.StandardSessionFacade@6b3bcb06        out.print(“会话对象=”+session);    }}

index.html

<!--测试session   42--><!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>session test</title></head><body><a href=/servlet12/test/session">测试session</a></body></html>

3.1session的实现原理:43

-JSESSIONID=这款xxxxx以Cookie的形式保存在浏览器的内存中。只需关闭浏览器即可。这就没有cookie了。

-session列表是Map,mapkey是sessionid,map的value是session的对象。

-服务器生成session对象,同时生成id,并将id发送给浏览器。

-用户自动将浏览器内存中的id发送到服务器,服务器根据id搜索session对象。

-关闭浏览器,内存消失,cookie消失,sessionid消失,会话等于结束。

3.1.2session实现原理详解43

web服务器中有一个session列表。类似于map集合。

这个map集合的key存储在sessionid

这个map集合的value存储对应的session对象

当家庭发送第一个请求时:服务器将创建-新的

session对象,同时为session对象生成-id,然后

web服务器:将sessionid发送给浏览器,浏览器将发送给浏览器

浏览器的缓存中保存了session的id。

当用户发送第二个请求时,浏览器缓存中的用户将自动

sessionid自动发送给服务器,服务器获得sessionid,

然后从session列表中找到相应的session对象。

3.2图解43

1.session对象存储在服务器端。

2.session对应一个会话。

3.一次会议包含多个请求。

关于B/S结构系统的会话机制_服务器_02

如何获得3.3session?43

HttpSessionsession=request.getSession();

从服务器中获取当前的session对象。

若未获得任何session对象,则新建。

HttpSessionsession=request.getSession(false):

从服务器中获取当前的session对象,

如果得不到session,就不会重建,返回nulll

3.4session对象什么时候被销毁?

一种销毁:超时销毁。

一种销毁:手动销毁。

为什么3.5关闭浏览器,会话结束?43

关闭浏览器后,保存在浏览器中的sessionid消失,下次重新打开浏览器后,

没有这个sessionid,浏览器缓存中自然找不到服务器中对应的session对象。

找不到session对象等于会话结束。

浏览器关闭时,服务器不知道,服务器无法监控浏览器关闭,因此session的销毁取决于session的超时机制。但也有可能系统提供了一个“安全退出”家庭,可以单击此按钮,以便服务器知道您退出,然后服务器将自动销毁session对象。

4.Cookie被禁用,session还能找到吗?43

-禁用cookie是什么意思?服务器通常将cookie发送给浏览器,但浏览器不需要。拒绝。不是服务器不发。

-找不到。每一个请求都会得到新的session对象。

4.1cookie被禁用,session机制还能实现吗?43

-是的。URL重写机制需要使用。

格式如下

http://localhost:8080/servlet12test/session;jsessionid=19D1C9560DCBF8489FA43DF56

-URL重写机制将增加开发人员的成本。当开发人员编写任何请求路径时,他们必须在后面添加sessionid,这给开发带来了巨大的困难和成本。所以大多数网站都是这样设计的:如果你禁止cookie,你就不会使用它。

5.总结一下我们对目前位置的理解:44

-request(对应类名:HttpServletRequest)

-请求域(请求级)

-session(对应类名:HttpSession)

-会话域(用户级)

-application(对应类名:ServletContext)

-所有用户共享的应用域(项目级别)

-这三个域对象的大小关系

-request<session<application

-三个域对象都有以下三种公共方法:

-setAttribute(绑定到域中的数据)

-getAttribute(从域中获取数据)

-removeAttribute(删除域中的数据)

-使用原则:尽量使用小域。