<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>欢迎页</title>
</head>
<body>
<!-- 前端超链接发送请求,请求路径以/开始,且要带着项目名-->
<h1><a href="/OA/text/session">打开Session</a></h1><br>
JSESSIONID=????,这个是以Cookie的形式保存在浏览器的内存的,浏览器关闭了,这个就没有了<br>
session列表是一个Map集合,map的ID是sessionID,value是session对象<br>
用户第一次请求session对象,服务器生成session对象,并生成对应的ID发送给浏览器<br>
关闭浏览器,内存消失,cookie消失,sessionID就搞丢了,服务器内的session此时没有被销毁,但是浏览器再也找不到她了,等同于会话结束了<br>
Cookie禁用了,session还能被找到吗?<br>
Cookie禁用是指服务器正常发送cookie给浏览器,但是浏览器不要了,不是服务器不发送sessionID<br>
会导致浏览器内部一直没有这个ID,会导致浏览器这里一直没有session,每一次她都会发送一个请求到浏览器<br>
浏览器都会创建一个新的session对象出来<br>
session对象(服务器端)就只能等待超时自动销毁<br>
如果我们禁用了cookie其实也是可以找到该session对象的<br>
我们需要记住session的sessionID,在url后面输入这个session对应的sessionID就能找到她了<br>
这个写法是jSessionID<br>
在系统实现上,需要使用url重写机制才能解决(不确定用户会不会在浏览器上设置禁用cookie)<br>
URL重写机制会提高开发的成本,在编写任何请求路径的时候都需要添加一个sessionID<br>
所以大部分的网站都是没有url重写机制的<br>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>欢迎页</title>
</head>
<body>
<!-- 前端超链接发送请求,请求路径以/开始,且要带着项目名-->
<h1><a href="/OA/text/session">打开Session</a></h1><br>
JSESSIONID=????,这个是以Cookie的形式保存在浏览器的内存的,浏览器关闭了,这个就没有了<br>
session列表是一个Map集合,map的ID是sessionID,value是session对象<br>
用户第一次请求session对象,服务器生成session对象,并生成对应的ID发送给浏览器<br>
关闭浏览器,内存消失,cookie消失,sessionID就搞丢了,服务器内的session此时没有被销毁,但是浏览器再也找不到她了,等同于会话结束了<br>
Cookie禁用了,session还能被找到吗?<br>
Cookie禁用是指服务器正常发送cookie给浏览器,但是浏览器不要了,不是服务器不发送sessionID<br>
会导致浏览器内部一直没有这个ID,会导致浏览器这里一直没有session,每一次她都会发送一个请求到浏览器<br>
浏览器都会创建一个新的session对象出来<br>
session对象(服务器端)就只能等待超时自动销毁<br>
如果我们禁用了cookie其实也是可以找到该session对象的<br>
我们需要记住session的sessionID,在url后面输入这个session对应的sessionID就能找到她了<br>
这个写法是jSessionID<br>
在系统实现上,需要使用url重写机制才能解决(不确定用户会不会在浏览器上设置禁用cookie)<br>
URL重写机制会提高开发的成本,在编写任何请求路径的时候都需要添加一个sessionID<br>
所以大部分的网站都是没有url重写机制的<br>
</body>
</html>
package com.bjpowernode.oa.web.action;
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;
@WebServlet("/text/session")
public class TestSessionServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//一次请求一个request对象,一个session对应很多request
//从服务器中获取session对象,如果没有则创建
HttpSession session = request.getSession();
response.setContentType("text/html;charset=UTF-8");
//Session机制属于BS结构的一部分,不同的计算机编程语言都有自己的实现类
//Http协议是一种无状态协议,访问的时候,BS的链接,访问完成会断开链接
//这是为了减轻服务器压力,因为这样的无状态协议可以降低服务器压力
//这样服务器压力小的多,BS断开了(在没有请求和响应时),服务器不知道浏览器断开链接了
//如网银(点我安全退出就是为了发送一次请求,让服务器关闭链接,避免造成安全隐患)
//因为我们直接退出时,服务器端我们的session对象没有销毁,而这个对象内还保存着我们的账号密码等私密信息
//安全退出就是为了销毁这个session对象
PrintWriter out = response.getWriter();
out.println("会话对象" + session);
session.setAttribute("","");
session.getAttribute("");
//业务场景,登陆了账号,电脑没有关闭网页,但是人没有操作
//没有新的request和response传输,然后隔了一段时间后才继续操作
//结果提示我们需要重新登录,登录失效,原因就是我们的session因为长时间没有操作
//被服务器清理了,导致我们的会话虽然没有关闭(关闭浏览器),但是我们的登陆状态失效了
//原理是,服务器内部有一个Session集合列表,类似于map
//我们的请求会同时请求一个对应的session号传过去,在response的时候传到浏览器
//浏览器记住这个session的ID,就可以每一次的request都找到同一个session
//为什么关闭浏览器会话会结束,原因是我们关闭浏览器的行为清除了我们浏览器的缓存
//导致sessionID丢失,浏览器再次打开并访问web服务的时候,没有对应的sessionID号
//就找不到对应的session对象了(此时服务器的session对象并没有被清除,还是保存在web服务器中的)
//因为我们的HTTP协议是无状态协议,我们没有请求响应时,双方没有链接,所以浏览器关闭,服务器是不知道的
//Session对象的销毁靠的是超时机制,除非手动销毁
}
}
package com.bjpowernode.oa.web.action;
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;
@WebServlet("/text/session")
public class TestSessionServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//一次请求一个request对象,一个session对应很多request
//从服务器中获取session对象,如果没有则创建
HttpSession session = request.getSession();
response.setContentType("text/html;charset=UTF-8");
//Session机制属于BS结构的一部分,不同的计算机编程语言都有自己的实现类
//Http协议是一种无状态协议,访问的时候,BS的链接,访问完成会断开链接
//这是为了减轻服务器压力,因为这样的无状态协议可以降低服务器压力
//这样服务器压力小的多,BS断开了(在没有请求和响应时),服务器不知道浏览器断开链接了
//如网银(点我安全退出就是为了发送一次请求,让服务器关闭链接,避免造成安全隐患)
//因为我们直接退出时,服务器端我们的session对象没有销毁,而这个对象内还保存着我们的账号密码等私密信息
//安全退出就是为了销毁这个session对象
PrintWriter out = response.getWriter();
out.println("会话对象" + session);
session.setAttribute("","");
session.getAttribute("");
//业务场景,登陆了账号,电脑没有关闭网页,但是人没有操作
//没有新的request和response传输,然后隔了一段时间后才继续操作
//结果提示我们需要重新登录,登录失效,原因就是我们的session因为长时间没有操作
//被服务器清理了,导致我们的会话虽然没有关闭(关闭浏览器),但是我们的登陆状态失效了
//原理是,服务器内部有一个Session集合列表,类似于map
//我们的请求会同时请求一个对应的session号传过去,在response的时候传到浏览器
//浏览器记住这个session的ID,就可以每一次的request都找到同一个session
//为什么关闭浏览器会话会结束,原因是我们关闭浏览器的行为清除了我们浏览器的缓存
//导致sessionID丢失,浏览器再次打开并访问web服务的时候,没有对应的sessionID号
//就找不到对应的session对象了(此时服务器的session对象并没有被清除,还是保存在web服务器中的)
//因为我们的HTTP协议是无状态协议,我们没有请求响应时,双方没有链接,所以浏览器关闭,服务器是不知道的
//Session对象的销毁靠的是超时机制,除非手动销毁
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<session-config>
<!-- 代表session的超时时间是30分钟,如果30分钟到,session对象就会被销毁-->
<session-timeout>30</session-timeout>
</session-config>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<session-config>
<!-- 代表session的超时时间是30分钟,如果30分钟到,session对象就会被销毁-->
<session-timeout>30</session-timeout>
</session-config>
</web-app>