JAVA-EE如何使用session实现的保存状态以及cookie禁用情况------计算机网络经典

<!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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值