Session

文章目录

    • 1.Session基本介绍
        • 1.Session有什么用?
        • 2.Session基本原理
        • 3.Session可以做什么?
        • 4.如何理解Session?
        • 5. Session基本使用
    • 2.Session底层机制
        • 1.示意图
        • 2.创建session底层机制
          • 1.有sessionid,但没session对象
            • 1.由于访问了jsp的主页面,会导致jsp创建一个sessionid,重新发布之后会将session对象删除
            • 2.代码实例
          • 2.有sessionid,有session对象
            • 1.刚才已经创建了一个新的session对象并绑定了一个新的sessionid,返回给浏览器,所以现在的浏览器既有sessionid又有session对象
            • 2.代码实例(还是刚才的代码)
          • 3.没有sessionid,没有session对象
            • 1.更换一个浏览器,此时这个浏览器并没有携带这个服务器的sessionid
            • 2.代码实例(还是刚才的代码)
        • 3.读取session底层机制
    • 3.Session的生命周期
        • 1.基本说明
          • 一个浏览器同一时间只能有一个session!!!
        • 2.设置指定过期时间
          • 1.CreateSession2.java
          • 2.readSession2.java
          • 3.结果演示
        • 3.删除session
    • 4.Session作业
        • 1.login.html
        • 2.error.html
        • 3.LoginCheckServlet.java
        • 4.ManageServlet.java
        • 5.结果展示
    • 5.Session小结
        • 关于getSession的理解

1.Session基本介绍

1.Session有什么用?

image-20240129152504406

image-20240129152713159

2.Session基本原理

image-20240129153514675

image-20240129153536665

3.Session可以做什么?

image-20240129153840095

4.如何理解Session?

image-20240129154021179

5. Session基本使用

image-20240129154436897

image-20240129154453770

2.Session底层机制

1.示意图

image-20240129155818596

image-20240129161048979

2.创建session底层机制
1.有sessionid,但没session对象
1.由于访问了jsp的主页面,会导致jsp创建一个sessionid,重新发布之后会将session对象删除
2.代码实例
package session;import sun.security.jgss.HttpCaller;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.DataOutput;
import java.io.IOException;
import java.io.PrintWriter;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/createSession")
public class CreateSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取session,并放值HttpSession session = req.getSession();session.setAttribute("session", "hello");resp.setContentType("text/html;charset=utf-8;");PrintWriter writer = resp.getWriter();writer.print("<h1>session设置成功</h1>");//关闭writer.flush();writer.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

image-20240129165223157

image-20240129165454372

2.有sessionid,有session对象
1.刚才已经创建了一个新的session对象并绑定了一个新的sessionid,返回给浏览器,所以现在的浏览器既有sessionid又有session对象
2.代码实例(还是刚才的代码)

image-20240129170306872

image-20240129170252297

3.没有sessionid,没有session对象
1.更换一个浏览器,此时这个浏览器并没有携带这个服务器的sessionid
2.代码实例(还是刚才的代码)

image-20240129171049106

image-20240129171041304

3.读取session底层机制
package session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/readSession")
public class readSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//读取sessionHttpSession session = req.getSession();Object session1 = session.getAttribute("session");//先判断一下是不是为nullif (session1 != null) {String res = (String) session1;resp.setContentType("text/html;charset=utf-8;");PrintWriter writer = resp.getWriter();writer.print("<h1>"+ res +"</h1>");//关闭writer.flush();writer.close();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

image-20240129180921006

3.Session的生命周期

1.基本说明
一个浏览器同一时间只能有一个session!!!

image-20240129182904375

image-20240129183219015

2.设置指定过期时间
1.CreateSession2.java
package session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/createSession2")
public class CreateSession2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建sessionHttpSession session = req.getSession();session.setAttribute("name", "lihua");//设置生命周期session.setMaxInactiveInterval(30);resp.setContentType("text/html;charset=utf-8;");PrintWriter writer = resp.getWriter();writer.print("<h1>session设置成功</h1>");//关闭writer.flush();writer.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
2.readSession2.java
package session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/readSession2")
public class readSession2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//读取sessionHttpSession session = req.getSession();Object name = session.getAttribute("name");//一定要判断不是空再返回if (name != null) {String res = (String) name;resp.setContentType("text/html;charset=utf-8;");PrintWriter writer = resp.getWriter();writer.print("<h1>"+ res +"</h1>");//关闭writer.flush();writer.close();}else {resp.setContentType("text/html;charset=utf-8;");PrintWriter writer = resp.getWriter();writer.print("<h1>该session不存在</h1>");//关闭writer.flush();writer.close();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
3.结果演示

image-20240129185250955

60秒后

image-20240129185331325

image-20240129185613295

3.删除session
package session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/deleteSession")
public class deleteSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取session,并设置立即过期(删除session)HttpSession session = req.getSession();session.invalidate();resp.setContentType("text/html;charset=utf-8;");PrintWriter writer = resp.getWriter();writer.print("<h1>session删除成功</h1>");//关闭writer.flush();writer.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

4.Session作业

image-20240129190405953

image-20240129190511930

1.login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>用户登录界面</h1>
<form action="check" method="get">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录">
</form>
</body>
</html>
2.error.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>登录失败</h1><br>
<a href="login.html">点击返回重新登录!</a>
</body>
</html>
3.LoginCheckServlet.java
package session;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/check")
public class LoginCheckServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取用户名和密码String username = req.getParameter("username");String password = req.getParameter("password");//进行验证if (password.equals("666666")) {//验证成功则设置sessionHttpSession session = req.getSession();session.setAttribute("username",username);//重定向到欢迎页面resp.sendRedirect("ManageServlet");}else {resp.sendRedirect("error.html");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
4.ManageServlet.java
package session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/ManageServlet")
public class ManageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//根据session中的信息判断是否是管理员HttpSession session = req.getSession();Object state = session.getAttribute("username");//如果是空的,则说明不是管理员if (state == null) {resp.sendRedirect("error.html");}String name = (String) state;resp.setContentType("text/html;charset=utf-8;");PrintWriter writer = resp.getWriter();writer.print("<h1>用户管理页面</h1><br>");writer.print("<h3>欢迎你 管理员" + name +"</h3><br>");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
5.结果展示

image-20240129194434029

image-20240129200006502

5.Session小结

关于getSession的理解
  1. 一个浏览器同时只能有一个session
  2. 注意,此时只要session不过期,那么这个浏览器每次请求服务的时候都会带上这个sessionid
  3. 首先会判断浏览器是否有sessionid
  4. 没有sessionid则会在浏览器端创建session对象并且将sessionid响应给浏览器(立即生效)
  5. 有sessionid则会判断服务器端是否有session对象
  6. 如果有session对象则直接使用
  7. 如果没有session对象则创建新的session对象并将新的sessionid响应给浏览器(立即生效)
  8. 这里立即生效的解释是,只要设置了session,就算进行了请求转发了,并没有进行第二次请求,那么转发到的那个servlet是可以立即读取到这个session的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue实现富文本编辑器的具体方法

可以实现富文本的插件&#xff1a;vue-quill-editor、editor-for-vue 我们以 editor-for-vue 为例实现&#xff1a; 传送门&#xff1a;wangEditor官网地址 安装&#xff1a; npm install wangeditor/editor --save npm install wangeditor/editor-for-vue --save具体使用方…

分布式锁的原子性问题

4.6 分布式锁的原子性问题 更为极端的误删逻辑说明&#xff1a; 线程1现在持有锁之后&#xff0c;在执行业务逻辑过程中&#xff0c;他正准备删除锁&#xff0c;而且已经走到了条件判断的过程中&#xff0c;比如他已经拿到了当前这把锁确实是属于他自己的&#xff0c;正准备删…

【matlab非线性规划工具箱安装2 GloptiPoly 3.10工具箱】

【matlab非线性规划工具箱安装2 GloptiPoly 3.10工具箱】 该博客是非线性手眼标定代码中所依赖的matlab工具箱的安装内容&#xff0c;除了进行手眼标定以外&#xff0c;该工具箱还可以用于其他的非线性规划问题 在安装该工具箱之前请先安装SeDuMi 手眼标定传送门&#xff1a…

实验案例一:交换机的初始配置

1、实验环境 实验用具包括一台 Cisco 交换机&#xff0c;一台 PC&#xff0c;一根 Console 线缆。 2、需求描述 如图 5.17 所示&#xff0c;实验案例一的配置需求如下。 通过 PC 连接并配置一台 Cisco 交换机在交换机的各个配置模式之间切换将交换机主机的名称改为 BDON 3、…

上门服务小程序|上门服务系统|上门服务软件开发流程

在如今快节奏的生活中&#xff0c;上门服务小程序的需求越来越多。它们向用户提供了方便、高效的服务方式&#xff0c;解决了传统服务行业中的很多痛点。如果你也想开发一个上门服务小程序&#xff0c;以下是开发流程和需要注意的事项。 1、确定需求&#xff1a;在开始开发之前…

✌2024/4/3—力扣—整数反转

代码实现&#xff1a; int reverse(int x) {long num 0;while (x ! 0) {num num * 10 x % 10;x x / 10;}if ((int)num ! num) {return 0;}return (int)num; }

Spring Cloud微服务入门(五)

Sentinel的安装与使用 安装部署Sentinel 下载Sentinel&#xff1a; https://github.com/alibaba/Sentinel/releases Sentinel控制台 https://localhost:8080 用户和密码为sentinel 使用Sentinel 加依赖&#xff1a; 写配置&#xff1a; 输入&#xff1a; java -Dserver.po…

UI自动化测试-pytest框架

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Lua热更新(AssetBundle)

AssetBundle 新版本导入ab包报错,则删除其中的Tests文件夹。 给资源分组 打包设置:平台、路径、重复打包清空文件夹、复制到streaming文件夹 建议勾选 建议使用LZ4压缩方式 用来观察文件中的包大小,不常用 参数总结: 这六个只做了解,重要的是上面的

Struts2的入门:新建项目——》导入jar包——》jsp,action,struts.xml,web.xml——》在项目运行

文章目录 配置环境tomcat 新建项目导入jar包新建jsp界面新建action类新建struts.xml,用来配置action文件配置Struts2的核心过滤器&#xff1a;web.xml 启动测试给一个返回界面在struts.xml中配置以实现页面的跳转&#xff1a;result再写个success.jsp最后在项目运行 配置环境 …

【数据分享】我国第七次人口普查的100m分辨率人口栅格数据(免费获取\tif格式\2020年)

人口空间分布数据是我们在各项研究中经常使用的数据。之前我们分享过来源于LandScan数据集的2000-2022年的1km精度的人口空间分布栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 相较于LandScan全球人口数据集&#xff0c;我国历次人口普查的数据对于…

SpringBoot通用模块--文件上传开发(阿里云OSS)

文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件上传服务&#xff0c;需要有存储的支持&#xff0c;那…

基于支持 GPT 的服务的初创公司

Kafkai&#xff1a;多语言长篇内容生成&#xff0c;AI写作的新趋势 介绍 随着生成式预训练 Transformer (GPT) 的出现&#xff0c;技术世界正在见证范式转变。 这种人工智能驱动的创新不仅仅是一种转瞬即逝的趋势&#xff0c;而是一种趋势。 它已成为科技行业的基石&#xff0c…

【C语言】简单介绍进制和操作符

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 本文简要介绍进制和操作符&#xff0c;愿能为您提供帮助&#xff01;文章…

异常的种类

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 Oracle 运行时错误可以分为 Oracle 错误和用户自定义错误&#xff0c;与此对应&#xff0c;根据异常产生的机制和原理&#xff0c;可将 Oracle 的系统异常分为 3 种 预定义…

使用VPN时,Java程序无法访问远程网络的解决办法

应用场景&#xff1a; 电脑连接VPN之后&#xff0c;Java程序无法连接远程服务&#xff0c;比如第三方接口、远程数据库连接、远程微服务等。我个人遇到的情况有连接海康威视SDK&#xff0c;influxdb以及一些微服务。 解决办法&#xff1a; 启动Java时加入参数&#xff1a;-D…

比较好玩的车子 高尔夫6

https://www.sohu.com/a/484063087_221273 四万多如愿收获手动挡高尔夫6&#xff0c;可靠性、经济性、操控性兼顾_搜狐汽车_搜狐网 2.基本上其他人也不知道到底是什么相关的车子信息

基于单片机和ICL7135多档位数字电压表设计

**单片机设计介绍&#xff0c;基于单片机和ICL7135多档位数字电压表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机和ICL7135的多档位数字电压表设计是一个结合了硬件与软件技术的综合性项目。这种设计旨在实现一…

Pnpm + Turbo 搭建 Web Component Monorepo 组件库

技术选型 使用 Pnpm Turbo 搭建 Web Component Monorepo项目 stencil-component-ui 组件库 pnpm 作为包管理器Turborepo 作为构建系统Vitepress 管理文档 pnpm 技术 什么是 pnpm? 它有哪些优势&#xff1f; pnpm 跟 npm、yarn一样&#xff0c;都是用于管理Node包依赖的管…

iOS App Store审核要求与Flutter应用的兼容性分析

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…