JAVA-EE的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对象的销毁靠的是超时机制,除非手动销毁
    }
}
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>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>欢迎页</title>
	</head>
	<body>
<!--	前端超链接发送请求,请求路径以/开始,且要带着项目名-->
		<h1><a href="/OA/text/session">打开Session</a></h1>
	</body>
</html>
<!DOCTYPE html>
<html>
    <head>
       <meta charset="utf-8">
       <title>欢迎页</title>
    </head>
    <body>
<!--    前端超链接发送请求,请求路径以/开始,且要带着项目名-->
       <h1><a href="/OA/text/session">打开Session</a></h1>
    </body>
</html>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值