JavaWeb学习(4)(四大域、HttpSession原理(面试)、SessionAPI、Session实现验证码功能)

目录

一、web四大域。

(1)基本介绍。

(2)RequestScope。(请求域)

(3)SessionScope。(会话域)

(4)ApplicationScope。(应用域)

(5)PageScope。(页面域)

二、HttpSession原理。

(1)Session的基本介绍。

(2)会话是什么?

1、会话的基本介绍。

2、会话的生命周期。

(3)HttpSession接口API。

1、HttpSession域对象功能。

2、HttpSession特有方法与属性。

(4)HttpSession底层原理。

1、Session的最基本特征。

2、Session底层图解。

3、Session底层解释。

4、Session自动失效与手动失效。

三、使用Session实现验证码与注销功能。

(1)前端jsp:表单项-验证码的代码。

(2)生成验证码的Servlet类。

(3)运行效果图。

(4)最终验证码的实现步骤。

1、第一次请求与响应。

2、第二次请求与响应。

3、第三次请求与响应。

4、LoginServlet类代码。


一、web四大域。

(1)基本介绍。
  • 在JavaWeb开发中,"四大域"是指四种不同的作用域(scope),它们用于存储和管理用户会话中的数据

(2)RequestScope。(请求域)

  • 作用域限定在"一次请求"中。即一个Servlet处理一个客户端请求的过程中。

  • 其数据存储在HttpServl
    etRequest对象中。
  • 常用于存储一次请求中需要的数据,比如表单提交的数据。
  • 使用次数:较多。

(3)SessionScope。(会话域)
  • 作用域限定在"一个用户会话"中。即从用户打开浏览器到关闭浏览器的整个过程中。

  • 数据存储在HttpSession对象中。
  • 常用于存储用户登录状态、用户偏好设置等需要跨多个请求保持的数据
  • 使用次数:多。

(4)ApplicationScope。(应用域)
  • 作用域限定在"整个Web应用程序"中。即所有用户共享

  • 数据存储在ServletContext对象ServletContext中。
  • 常用于存储全局信息。(比如配置信息、应用级别的计数器等)
  • 使用次数:较少。

(5)PageScope。(页面域)

  • 作用域限定在"JSP页面的生命周期"内。即从JSP页面被请求到页面渲染完成的过程中。

  • 数据存储在JSP页面的隐式对象pageContext中。
  • 常用于存储JSP页面内的数据,比如JSP标签和脚本片段之间的数据共享。
  • 使用次数:较少。

二、HttpSession原理。

(1)Session的基本介绍。
  • 在JavaWeb开发中,Session通常指的是HttpSession接口
  • HttpSession是Java Servlet API提供的一个接口。
  • HttpSession的对象代表了客户端与服务器端之间的一个会话。用于在客户端和服务器端之间保持状态,即跟踪用户的会话
(2)会话是什么?
1、会话的基本介绍。
  • 在Web开发中,会话(Session)是指服务器与客户端之间的一次连续的交互过程,它允许服务器跟踪和存储用户的状态信息。

  • 客户端打开浏览器,访问服务器,表示会话开始。只要浏览器不关闭,本次会话一直存在。而且这次的会话的所有请求,全部共享一个Session域。(request域对象,只在用一次请求有效,作用域小
  • 当客户端关闭浏览器,表示会话的结束。

  • 每一个客户端都有自己的会话。(Session)

2、会话的生命周期。
  • 会话有开始和结束。
  • 通常:从用户第一次与服务器交互时创建,直到用户关闭浏览器。
  • 其它情况:话超时服务器配置的最大会话时间限制。

(3)HttpSession接口API。
  • 查阅javaEE接口文档。


1、HttpSession域对象功能。
  • 如下都是Session的重要方法。
  • 其中有几个四大域对象都有的方法。其它的是Session域对象特有的特性与方法。


2、HttpSession特有方法与属性。
  • SessionID:Session的唯一标识。
  • setMaxInactiveInterval(int):最大间隔时间意思就是该Session从上一次使用到下一次使用的间隔。

  • invalidate():让当前Session失效!用户的退出登录(注销)功能实现就是让当前Session域失效!
  • 注销类"LogOutServlet"代码如下。
package com.fs.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;/*** @Title: LoginService* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/25 下午9:16* @description: 退出登录处理*/
@WebServlet("/logout")
public class LogOutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//让session失效req.getSession().invalidate();//重定向到登录界面resp.sendRedirect("/login.jsp");}
}
(4)HttpSession底层原理。
1、Session的最基本特征。
  • 创建于服务器,保存于服务器
  • 每一个用户都有自己的Session对象。(Session不是共享的)
  • 底层依赖于——Cookie实现。
2、Session底层图解。
  • 服务器为每一个客户端创建Session对象时,都会生成唯一的SessionID。
  • 响应给客户端时,将SessionID存储在Cookie中。注意SessionID是加密的。Cookie之后的每一次请求会自动的将SessionID发送给服务器。
  • 服务器拿到SessionID进行解析并寻找对应的Session对象。




3、Session底层解释。
  • Session底层是依赖Cookie的!
  • 注意Session无法跨浏览器的。

  • 当我首次去银行时,因为还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号,我的钱是保存在银行的账号中,而我带走的是我的卡号。
  • 当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!

  • 首次使用Session时,服务器端要创建Session对象Session是保存在服务器端,而给客户端的是SessionID(一个cookie中保存SessionID)。客户端带走的是SessionID,而数据是保存在Session对象中。
  • 客户端再次访问服务器时,在请求中会带上SessionID。而服务器会通过SessionID找到对应的Session对象,而无需再创建新的Session对象。


4、Session自动失效与手动失效。
  • 开发人员可以通过调用Session对象的的invalidate()方法来手动使Session失效。这通常在用户注销或退出登录时使用。


  • Session对象会有一个默认的超时时间,如果用户在这段时间内没有任何操作,Session将会自动失效
  • 当服务器重启或重启应用时,所有的Session对象都会被销毁,导致所有用户的Session失效。或者关闭浏览器通常也会导致Session失效。

三、使用Session实现验证码与注销功能。

(1)前端jsp:表单项-验证码的代码。
  • 注意生成验证码图片的功能是通过代码完成。(访问指定的"/XXXServlet")
  • 注意:css样式使用的是bootstrap提供的样式与组件。通过<link>标签在线引入。
<div class="form-inline"><label for="vcode">验证码:</label><input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/><a href="javascript:refreshCode()"><img src="/checkCode" title="看不清点击刷新" id="vcode"/></a></div>
  • 刷新验证码时,触发点击事件,调用方法refreshCode()。代码如下。
<script type="text/javascript">//js定义函数function refreshCode(){//不做下面处理,就会走浏览器缓存, url没有变化, 导致使用上一次缓存内容,不会刷新验证码//选择器 #id名——>获取到img标签//使用attr()设置属性"src"值。//加一个时间戳, 每次都不一样, 浏览器发现参数不一样, 误以为是新请求,不走缓存,就会刷新$("#vcode").attr("src","/checkCode?"+new Date().getTime());}</script>
(2)生成验证码的Servlet类。
package com.fs.web;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 验证码*/
@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//服务器通知浏览器不要缓存response.setHeader("pragma","no-cache");response.setHeader("cache-control","no-cache");response.setHeader("expires","0");//在内存中创建一个长80,宽30的图片,默认黑色背景//参数一:长//参数二:宽//参数三:颜色int width = 80;int height = 30;BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//获取画笔Graphics g = image.getGraphics();//设置画笔颜色为灰色g.setColor(Color.GRAY);//填充图片g.fillRect(0,0, width,height);//产生4个随机验证码,12EyString checkCode = getCheckCode();//将验证码放入HttpSession中。//这里很重要,因为登录请求时,需要拿取服务器生成的验证码与用户输入的验证码进行校验!request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);//设置画笔颜色为黄色g.setColor(Color.YELLOW);//设置字体的小大g.setFont(new Font("黑体",Font.BOLD,24));//向图片上写入验证码g.drawString(checkCode,15,25);//将内存中的图片输出到浏览器//参数一:图片对象//参数二:图片的格式,如PNG,JPG,GIF//参数三:图片输出到哪里去ImageIO.write(image,"PNG",response.getOutputStream());}/*** 产生4位随机字符串 */private String getCheckCode() {String base = "0123456789ABCDEFGabcdefg";int size = base.length();Random r = new Random();StringBuffer sb = new StringBuffer();for(int i=1;i<=4;i++){//产生0到size-1的随机值int index = r.nextInt(size);//在base字符串中获取下标为index的字符char c = base.charAt(index);//将c放入到StringBuffer中去sb.append(c);}return sb.toString();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(3)运行效果图。


(4)最终验证码的实现步骤。
1、第一次请求与响应。
  • 第一次请求:客户端请求login.jsp(登录页面)。
  • 服务器第一次响应。在客户端显示login.jsp(登录页面)。

2、第二次请求与响应。
  • 第二次请求"XXXServlet":请求客户端登录界面中的随机验证码图片。

  • 服务器第二次响应。并将生成的随机验证码存储在Session域中。
  • 为什么验证码不存储在Cookie中?不安全、无意义。因为Cookie暴露在客户端,用户可以查看和修改!

  • 随后在登录界面的验证码位置显示生成的验证码图片。


3、第三次请求与响应。
  • 第三次请求:用户在客户端填写(用户名、密码、验证码等)后,点击提交"登录"按钮。也就是登录请求。("/LoginServlet")
  • 服务器处理请求。首先判断验证码是否正确!!

  • 如何校验用户输入的验证码与服务器响应的验证码一致?
  • 在第二次请求与响应中,服务器将生成的随机验证码存储在Session中。因为验证码每生成一次就不能让用户去更改,所以存储在服务器(域对象),而不是存储在客户端
  • 使用Session技术!而不使用Request域。是因为不是同一次请求,拿不到数据。
  • 通过会话(Session)技术可以实现该功能。

  • 第三次请求服务器拿到用户提交的验证码与Session域获取到的验证码进行比对即可。
  • 通过HttpServletRequest对象的getSession()方法获取到HttpSession对象。
  • 再通过HttpSession对象的getAttribute("键名")得到对应的键值(验证码)即可。

4、LoginServlet类代码。
  • 其中涉及到"记住我"功能的实现。(使用Cookie技术)
package com.fs.web;import com.fs.entity.LoginInfo;
import com.fs.service.LoginService;
import com.fs.service.impl.LoginServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Objects;/*** @Title: LoginService* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/25 下午9:16* @description: 登录处理*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.设置post请求编码, 响应编码req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");//进行验证码验证//获取用户输入的验证码String verifycode = req.getParameter("verifycode");//获取服务器发来的验证码。与session存的验证码比对HttpSession session = req.getSession();String codeServer = (String) session.getAttribute("CHECKCODE_SERVER");if (codeServer.equals(verifycode)) {//2.获取请求参数String username = req.getParameter("user");String password = req.getParameter("password");//3.调用业务层LoginService的登录方法LoginService loginService = new LoginServiceImpl();LoginInfo loginInfo = loginService.login(username, password);//4.根据返回结果跳转到不同的资源if (loginInfo != null) { //登录成功//判断是否勾选记住我String rem = req.getParameter("rem");if (Objects.nonNull(rem)) {//设置CookieCookie cookie1 = new Cookie("user", username);Cookie cookie2 = new Cookie("password", password);//设置存活时间(单位:秒)//7天cookie1.setMaxAge(60 * 60 * 24 * 7);cookie2.setMaxAge(60 * 60 * 24 * 7);//设置path为/  项目下任何资源可以访问cookie1.setPath("/");cookie2.setPath("/");//发送Cookieresp.addCookie(cookie1);resp.addCookie(cookie2);}//跳转之前把LoginInfo对象保存到session域中session.setAttribute("loginUser",loginInfo);//重定向到index.html页面resp.sendRedirect("/index.jsp");} else { //登录失败//转发到登录页面req.setAttribute("error", "账号或密码错误!");req.getRequestDispatcher("/login.jsp").forward(req, resp);}} else { //验证码错误req.setAttribute("error", "验证码输入错误!");req.getRequestDispatcher("/login.jsp").forward(req, resp);}}
}

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

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

相关文章

C++ 菱形继承 +虚继承

菱形继承 两个派生类继承同一个基类而又有某个类同时继承者两个派生类&#xff0c;这种继承被称为菱形继承&#xff0c;或者钻石型继承。 菱形继承存在的问题 1&#xff09;羊继承了动物的数据和函数&#xff0c;鸵同样继承了动物的数据和函数&#xff0c;当草泥马调用函数或者…

LCR 103. 零钱兑换 (从dfs->记忆化搜索->动态规划)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。 示例 1&#xff1a; 输入&#xff1a;coins [1, 2, 5], amount …

密码学——密码学基础、散列函数与数字签名

1.密码学概述 是信息安全的基础和核心&#xff0c;是防范各种安全威胁的重要手段&#xff0c;信息安全的许多相关知识都与密码学相关。 密码学发展 密码学是一门古老而又年轻的学科 &#xff0c;几千年以前就存在&#xff0c;至今仍在发展演进。地位非常重要甚至起决定性作用…

JS API日期对象

目标&#xff1a;掌握日期对象&#xff0c;可以让网页显示日期 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 实例化 目标&#xff1a;能够实现实例化日期对象 在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化 创建一个时…

CTFshow-命令执行(Web29-40)

CTFshow-命令执行(Web29-40) CTFWeb-命令执行漏洞过滤的绕过姿势_绕过空格过滤-CSDN博客 总结rce&#xff08;远程代码执行各种sao姿势&#xff09;绕过bypass_远程命令执行绕过-CSDN博客 对比两者的源代码&#xff0c;我们发现&#xff0c;cat指令把flag.php的内容导出后依…

Qt Pro 常用配置

Part1: Summary Qt 开发中 Pro 文件的内容很多&#xff0c;需要不断的去学习和使用&#xff0c;现系统性的整理一下。以备录&#xff1b; 1.创建pro文件 1.1 步骤&#xff1a; Qt Creator--->New Project--->应用程序--->Qt Widgets Application--->名称为&…

移动端自动化Auto.js入门及案例实操

前提&#xff1a; Appium 和 Airtest 编写的自动化脚本都依赖于 PC 端运行&#xff0c;没有办法直接运行在移动端 Auto.js是什么&#xff1f; 1.是 Android 平台上的一款自动化工具&#xff0c;它通过编写 JavaScript 脚本&#xff0c;对 App 进行自动化操作 2.只支持安卓&a…

【SH】微信小程序调用EasyDL零门槛AI开发平台的图像分类研发笔记

文章目录 微信小程序字符串字符串模板字符串拼接 上传图片编写JS代码编写wxml代码编写wxss代码 GET请求测试编写测试代码域名不合法问题 GET和POST请求测试编写JS代码编写wxml代码编写wxss代码 效果展示 微信小程序字符串 字符串模板 这是ES6引入的特性&#xff0c;允许你通过…

【深度学习入门】深度学习介绍

1.1 深度学习介绍 学习目标 目标 知道深度学习与机器学习的区别了解神经网络的结构组成知道深度学习效果特点 应用 无 1.1.1 区别 1.1.1.1 特征提取方面 机器学习的特征工程步骤是要靠手动完成的&#xff0c;而且需要大量领域专业知识深度学习通常由多个层组成&#xff0c…

SparkSQL与Hive的整合

文章目录 SparkSQL与Hive的整合1.1. Spark On Hive1.1.1. Hive的准备工作1.1.2. Spark的准备工作1.1.3. Spark代码开发1.1.4. Spark On Hive案例 1.2. Hive On Spark1.3. SparkSQL命令行1.4. SparkSQL分布式查询引擎1.4.1. 开启ThriftServer服务1.4.2. beeline连接ThriftServer…

梳理你的思路(从OOP到架构设计)_基本OOP知识03

目录 1、<基类/子类 >结构的接口(卡榫函数) 1&#xff09;卡榫(Hook) 2&#xff09;卡榫函数的Java实现 2、IoC机制与基於 Default 軟硬整合觀點 函数 1&#xff09;卡榫函数实现IoC机制 2&#xff09;默认(Default)行为 1、<基类/子类 >结构的接口(卡榫函数…

软件测试--录制与回放脚本

准备工作 安装phpstudy 配置两个内容 放demo44文件夹 在浏览器输入http://localhost/demo44/index.html&#xff0c;出现如图所示的网站 输入用户名和密码 步骤一&#xff1a;打开Virtual User Generator&#xff0c;点击新建&#xff0c;点击new 步骤二&#xff1a;点击如下…

1.2.3计算机软件

一个完整的计算机系统由硬件和软件组成&#xff0c;用户使用软件&#xff0c;而软件运行在硬件之上&#xff0c;软件进一步的划分为两类&#xff1a;应用软件和系统软件。普通用户通常只会跟应用软件打交道。应用软件是为了解决用户的某种特定的需求而研发出来的。除了每个人都…

前端传入Grule,后端保存到 .grl 文件中

前端传入Grule&#xff0c;后端保存到 .grl 文件中 通过简单的输入框&#xff0c;将Grule的部分拆解成 规则名称 规则描述 规则优先级 规则条件 规则逻辑Grule关键字 when Then 模拟了 if 判断的条件和逻辑部分 类似于 shell 和 ruby 之类的脚本语言&#xff0c;有 then 关键字…

公众号看到一个小知识(遥感影像标签的数值问题)

遥感影像标签的数值问题。 拿到手的标签图像&#xff0c;是二分类形式&#xff0c;分为0和1。 这样的形式&#xff0c;不能直接在win10打开。双击图像文件后&#xff0c;如下&#xff1a; 但是可以在QGIS可视化。在QGIS可视化如下&#xff1a; 为什么会这样&#xff1f;大概是因…

【干旱指数】非一致性干旱指数:SnsPI

非一致性干旱指数:SnsPI 非一致性SPI 干旱指数(SnsPI)指数简介MATLAB代码实现Python代码实现参考近年来受气候和人类活动的显著影响,水文序列形成的物理基础条件发生变化,导致水文序列不满足一致性假定即呈非一致性特征。 已有研究主要通过以下两类方法解决非一致性干旱问…

《九重紫》逐集分析鉴赏—序言、概览、框架分析

主标题:《九重紫》一起追剧吧副标题:《九重紫》逐集分析鉴赏—序言、概览、框架分析《永夜星河》后,以为要浅尝剧荒,一部《九重紫》突出重围。看了宣传片感觉不是很差,看了部分剪辑感觉还可以,看了一两集感觉可以追吧,又看了几集——有新欢了,永夜我终于可以放下了,终…

Python Bokeh库:实现实时数据可视化的实战指南

目录一、Bokeh简介二、安装Bokeh三、创建简单的Bokeh图表四、实时更新图表五、集成到Flask应用中六、注意事项七、总结在数据分析和科学计算中,数据可视化是不可或缺的一部分。它能够直观地展示数据,帮助我们快速发现规律和趋势。Bokeh是Python中一个强大的数据可视化库,尤其…

月底课程关闭 | 中国大学MOOC公开课《人工智能与交通大数据实战》首次开课,欢迎选修!...

各位小伙伴们,今年我在中国大学MOOC开设面向全国高校师生的《人工智能与交通大数据实战》课程,编号:0818BJTU217,交通、土木、规划、计算机等领域的本科生和研究生都可以选,欢迎大家选课交流!也欢迎大家推荐给身边的同学和学弟学妹们选课!今年首次开课,课程内容与我在北…

Node.js(v16.13.2版本)安装及环境配置教程

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位&#xff08;v16.13.2版本&#xff09; 下载后的zip文件 二、解压文件到nodejs&#xff0c;并打开文件夹nodejs&#xff0c;复制解压…