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对象是李四的。
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实现原理详解43web服务器中有一个session列表。类似于map集合。
这个map集合的key存储在sessionid
这个map集合的value存储对应的session对象
当家庭发送第一个请求时:服务器将创建-新的
session对象,同时为session对象生成-id,然后
web服务器:将sessionid发送给浏览器,浏览器将发送给浏览器
浏览器的缓存中保存了session的id。
当用户发送第二个请求时,浏览器缓存中的用户将自动
sessionid自动发送给服务器,服务器获得sessionid,
然后从session列表中找到相应的session对象。
3.2图解431.session对象存储在服务器端。
2.session对应一个会话。
3.一次会议包含多个请求。
如何获得3.3session?43HttpSessionsession=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(删除域中的数据)
-使用原则:尽量使用小域。