session 生命周期和经典案例-防止非法进入管理页面

文章目录

  • session 生命周期和Session 经典案例-防止非法进入管理页面
    • session 生命周期
      • Session 生命周期-说明
      • 代码演示说明 Session 的生命周期
        • 创建CreateSession2
        • 创建ReadSession2
    • 解读Session 的生命周期
      • 代码示例
        • 创建DeleteSession
    • Session 经典案例-防止非法进入管理页面
      • 需求
        • 用户名不限制
      • login.html
      • LoginCheckServlet
      • ManageServlet
      • error.html

session 生命周期和Session 经典案例-防止非法进入管理页面

session 生命周期

Session 生命周期-说明

  1. public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。

  2. 值为正数的时候,设定 Session 的超时时长。

  3. 负数表示永不超时

  4. public int getMaxInactiveInterval()获取 Session 的超时时间

  5. public void invalidate() 让当前 Session 会话立即无效

  6. 如果没有调用 setMaxInactiveInterval() 来指定 Session 的生命时长,Tomcat 会以 Session默认时长为准,Session 默认的超时为 30 分钟, 可以在 tomcat 的 web.xml 设置
    在这里插入图片描述

  7. Session 的生命周期指的是 :客户端/浏览器两次请求最大间隔时长,而不是累积时长。即当客户端访问了自己的 session,session 的生命周期将从 0 开始重新计算。(解读: 指的是同一个会话两次请求之间的间隔时间)

  8. 底层: Tomcat 用一个线程来轮询会话状态,如果某个会话的空闲时间超过设定的最大值,则将该会话销毁

代码演示说明 Session 的生命周期

创建CreateSession2

public class CreateSession2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("CreateSession2 被调用");//创建sessionHttpSession session = request.getSession();System.out.println("CreateSession2 sid= " + session.getId());//设置生命周期为 60ssession.setMaxInactiveInterval(60);session.setAttribute("u", "jack");//回复一下浏览器response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>创建session成功, 设置生命周期60s</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

创建ReadSession2

public class ReadSession2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//System.out.println("ReadSession2 被调用...");//1. 获取到sessionHttpSession session = request.getSession();System.out.println("ReadSession2 sid= " + session.getId());//2. 读取session的属性Object u = session.getAttribute("u");if (u != null) {System.out.println("读取到session属性 u= " + (String) u);} else {System.out.println("读取不到session属性 u 说明原来的session被销毁");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

解读Session 的生命周期

  1. 指的是两次访问 session 的最大间隔时间

  2. 如果你在 session 没有过期的情况下,操作 session, 则会重新开始计算生命周期

  3. session 是否过期,是由服务器来维护和管理

  4. 如我们调用了 invaliate() 会直接将该 session 删除/销毁

  5. 如果希望删除 session 对象的某个属性, 使用 removeAttribu(“xx”)

代码示例

创建DeleteSession

public class DeleteSession extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("DeleteSession 被调用...");//演示如何删除sessionHttpSession session = request.getSession();session.invalidate();// 如果你要删除session的某个属性//session.removeAttribute("xxx");//回复一下浏览器response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>删除session成功</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

Session 经典案例-防止非法进入管理页面

需求

只要密码为 666666, 我们认为就是登录成功

用户名不限制

  1. 如果验证成功,则进入管理页面 ManageServelt.java ,否则进入 error.html

  2. 如果用户直接访问 ManageServet.java , 重定

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title>
</head>
<body>
<h1>用户登录界面</h1>
<form action="/cs/loginCheck" method="post">u:<input type="text" name="username"><br/>p:<input type="password" name="pwd"><br/><input type="submit" value="登录">
</form>
</body>
</html>

LoginCheckServlet

public class LoginCheckServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("LoginCheckServlet 被调用..");//功能-> 自己拆解 -> 逐步实现//1. 得到提交的用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");if("666666".equals(password)) {//认为合法//把用户名保存到 sessionHttpSession session = request.getSession();session.setAttribute("loginuser", username);//请求转发到ManageServletrequest.getRequestDispatcher("/manage").forward(request, response);} else {//请求转发进入到 error.htmlrequest.getRequestDispatcher("/error.html").forward(request, response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

ManageServlet

public class ManageServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//判断该用户是否登录过HttpSession session = request.getSession();Object loginuser = session.getAttribute("loginuser");if(loginuser == null) {//说明该用户没有登录//重新登录-> 请求重定向//response.sendRedirect("/cs/userlogin.html");response.sendRedirect(request.getContextPath() + "/userlogin.html");return;} else {response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>用户管理页面</h1>");writer.println("欢迎你, 管理员:" + loginuser.toString());writer.flush();writer.close();}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

error.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录失败</title>
</head>
<body>
<h1>登录失败</h1>
<!--
web工程路径专题
1. a 标签是 浏览器解析
2. 第一 / 被解析成 http://localhost:8080/
3. 如果没有 / 会以当前浏览器地址栏 的 http://localhost:8080/工程路径../资源 去掉资源部分作为参考路径
-->
<a href="/cs/userlogin.html">点击重新登录</a>
</body>
</html>

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

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

相关文章

【25】SCI易中期刊推荐——神经网络科学(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

三菱PLC 控制灯一秒钟交替闪烁

三菱PLC中常用的特殊继电器&#xff1a; M8000 上电一直ON标志 M8002 上电导通一次 M8004 PLC出错 M8005 PLC备用电池电量低标志 M8011 10ms时钟脉冲 M8012 100ms时钟脉冲 M8013 1s时钟脉冲 M8014 1min时钟脉冲 M8034…

用 perfcollect 洞察 Linux 上.NET程序CPU爆高

一&#xff1a;背景 1. 讲故事 如果要分析 Linux上的 .NET程序 CPU 爆高&#xff0c;按以往的个性我肯定是抓个 dump 下来做事后分析&#xff0c;这种分析模式虽然不重但也不轻&#xff0c;还需要一定的底层知识&#xff0c;那有没有傻瓜式的 CPU 爆高分析方式呢&#xff1f;…

缓存数据一致性探究

缓存数据一致性探究 缓存是一种较低成本提升系统性能的方式&#xff0c;自它面世第一天起就备受广大开发者的喜爱。然而正如《人月神话》中的那句经典的“没有银弹”中所说&#xff0c;软件工程的设计没有银弹。 就像每一次发布上线修复问题的同时&#xff0c;也极易引入新的问…

element el-collapse折叠面板箭头在前显示

::v-deep .el-collapse-item__arrow {position: absolute;left: 30px;}

【山河送书第三期】:《Python机器学习:基于PyTorch和Scikit-Learn 》赠书四本!!

【山河送书第三期】&#xff1a;《Python机器学习&#xff1a;基于PyTorch和Scikit-Learn 》 前言内容简介作者简介参与方式 前言 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务…

PyTorch 安装

本文基于conda安装&#xff0c;请确保已经安装好Anaconda&#xff0c;可参考上一篇文章安装Anaconda。 一、确定本机CUDA版本 基于N卡&#xff0c;基于N卡&#xff0c;基于N卡 nvidia-smi #N卡用此命名查看&#xff0c;N卡如果没有此命令&#xff0c;先去更新显卡驱动二、安…

基于单片机电子密码锁射频卡识别指纹门禁密码锁系统的设计与实现

功能介绍 通过指纹进行开锁或者是按键输入当前的密码&#xff0c;修改密码&#xff0c;对IC卡可以进行注册&#xff0c;删除。当有RFID卡进入到读卡器的读卡范围内时&#xff0c;则会自动读取卡序列号&#xff0c;单片机根据卡的序列号对卡进行判断。若该卡是有效卡&#xff0c…

波奇学Linux:git和gdb调试

git用来版本控制&#xff0c;同样是版本控制的软件还有svn等。 git的特定是具有网络功能的版本控制器&#xff0c;开源&#xff0c;client和server是一体的。(去中心化分布式管理) client和server一体意味着远程仓库和本地仓库是平等地位&#xff0c;远程仓库是特殊的仓库而已…

CSS详解

这里写目录标题 cssCSS 是什么基本语法规范引入方式内部样式表行内样式表外部样式关于缓存: 选择器的功能选择器的种类 类选择器语法细节:作用特点 id 选择器后代选择器选择器 作用 注意事项 其他 css CSS 是什么 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素…

参数名的映射,小心使用strict=False

从vgg16-397923af.pth里读取的数值应该和加载预训练模型后model.load_state_dict参数一致。 而我的不一致&#xff01; 原因&#xff1a;在载入参数到模型键值的不匹配&#xff0c;所以使用了strictFalse。 解决办法&#xff1a; 进行参数名的映射&#xff0c;将不匹配的参数名…

【论文阅读】《Distilling the Knowledge in a Neural Network》

【论文阅读】《Distilling the Knowledge in a Neural Network》 推荐指数&#xff1a; 1. 动机 &#xff08;1&#xff09;虽然一个ensemble的模型可以提升模型的效果&#xff0c;但是在效率方面实在难以接受&#xff0c;尤其是在每个模型都是一个大型的网络模型的时候。 &…