当前位置: 首页 > news >正文

通过Session共享数据验证码进行用户登录

通过Session共享数据验证码进行用户登录

  • 需求:
  1. 访问带有验证码的登录页面login.jsp。
  2. 用户输入用户名,密码以及验证码。
    ①。如果用户名和密码输入有误,跳转登陆页面,提示:用户名或密码错误。
    ②。如果验证码输入有误,跳转登录页面,提示:验证码错误。
    ③。如果全部输入正确,则跳转到主页success.jsp,显示用户名,欢迎你。在这里插入图片描述

(一)验证码

  • 创建com.zm.servlet
  • 在文章👉👉👉HTTP协议响应消息和Response对象响应消息【案例:重定向、验证码】👈👈👈里面将验证码的代码复制到com.zm.servlet包里面。
  • 并且注意添加几行代码,用“👈”标识的;目的是为了将随机生成的验证码存储到session中,进行共享数据,方便其他页面可以获取数据。
StringBuilder sb = new StringBuilder();//👈
for (int i = 1; i <= 4; i++) {int index = ran.nextInt(str.length());//获取字符char ch = str.charAt(index);//随机字符sb.append(ch);//👈//2.3写验证码g.drawString(ch+"",width/5*i,height/2);
}
String checkCode_session = sb.toString();//👈
//将验证码存入session
request.getSession().setAttribute("checkCode_session",checkCode_session);//👈

(二)登录页面

  • webapp文件里面创建login.jsp页面。
    在这里插入图片描述
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head><title>登录页面</title><script>window.onload = function () {//1.获取图片对象var img = document.getElementById("checkCode");//2.绑定单击事件img.onclick = function () {//加时间戳var date = new Date().getTime();img.src = "/tomcat_demo/CheckCodeServlet?" + date;}}</script><style>div{color: red;}</style>
</head>
<body><form action="/tomcat_demo/LoginServlet" method="post"><table align="center" cellspacing="0" border="1"><tr><td>用户名</td><td><input type="text" name="username"></td></tr><tr><td>密码</td><td><input type="password" name="password"></td></tr><tr><td>验证码</td><td><input type="text" name="checkCode"></td></tr><tr><td colspan="2"><img id="checkCode" src="/tomcat_demo/CheckCodeServlet"></td></tr><tr><td align="center" colspan="2"><input type="submit" value="登录"></td></tr></table></form><div align="center"><%= request.getAttribute("cc_error")==null ? "" : request.getAttribute("cc_error")%></div><div align="center"><%= request.getAttribute("login_error")==null ? "" : request.getAttribute("login_error")%></div>
</body>
</html>
  • 上述代码中,有一部分是一下部分代码块,实现的功能是通过点击登录按钮后,页面将会提示用户输入的信息是否错误。
    在这里插入图片描述在这里插入图片描述
<style>div{color: red;}
</style><div align="center"><%= request.getAttribute("cc_error")==null ? "" : request.getAttribute("cc_error")%></div>
<div align="center"><%= request.getAttribute("login_error")==null ? "" : request.getAttribute("login_error")%></div>

(三)登录成功页面

  • webapp文件里面创建success.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录成功</title>
</head>
<body><h1><%= request.getSession().getAttribute("user")%>,欢迎您</h1>
</body>
</html>

在这里插入图片描述

(四)验证码检验

package com.zm.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置编码request.setCharacterEncoding("utf-8");//2.获取参数String username = request.getParameter("username");String password = request.getParameter("password");String checkCode = request.getParameter("checkCode");//3.先获取生成的验证码HttpSession session = request.getSession();String checkCode_session = (String) session.getAttribute("checkCode_session");//删除session中存储的验证码session.removeAttribute("checkCode_session");//4.先判断验证码是否正确if (checkCode_session!= null && checkCode_session.equalsIgnoreCase(checkCode)){//忽略大小写比较//验证码正确//判断用户名和密码是否一致if ("zhangsan".equals(username) && "123".equals(password)){//需要调用UserDao查询数据库//登录成功//存储信息,用户信息session.setAttribute("user",username);//重定向到success.jspresponse.sendRedirect(request.getContextPath()+"/success.jsp");}else {//登录失败//存储提示信息到requestrequest.setAttribute("login_error","用户名或密码错误");//转发到登录页面request.getRequestDispatcher("/login.jsp").forward(request,response);}}else {//验证码不一致//存储提示信息到requestrequest.setAttribute("cc_error","验证码错误");//转发到登录页面request.getRequestDispatcher("/login.jsp").forward(request,response);}}
}

相关文章:

通过Session共享数据验证码进行用户登录

通过Session共享数据验证码进行用户登录 需求&#xff1a; 访问带有验证码的登录页面login.jsp。用户输入用户名&#xff0c;密码以及验证码。 ①。如果用户名和密码输入有误&#xff0c;跳转登陆页面&#xff0c;提示&#xff1a;用户名或密码错误。 ②。如果验证码输入有误…...

C++STL详解(六)——stack和queue

文章目录空间适配器stackstack的定义方式stack的使用stack的模拟实现queuequeue的定义方式queue的使用queue的模拟实现空间适配器 适配器是一种设计模式&#xff08;设计模式是一套被反复使用的&#xff0c;多数人知晓的&#xff0c;经过分类编目的&#xff0c;代码设计经验的…...

javaEE 初阶 — CSS 的 基本语法 与 引入方式

文章目录1. 基本语法规范2. 三种引入方式1. 基本语法规范 CSS 的基本语法规范是由 选择器 和 若干个声明 组成的。 选择器选中一个元素之后&#xff0c;这些属性都是针对于这个元素展开的。 先来看一个没有 CSS 的效果。 <body><p>这是一个段落</p> </bo…...

QEMU启动ARM32 Linux内核

目录前言前置知识ARM Versatile Express开发板简介ARM处理器家族简介安装qemu-system-arm安装交叉编译工具交叉编译ARM32 Linux内核交叉编译ARM32 Busybox使用busybox制作initramfs使用QEMU启动ARM32 Linux内核模拟vexpress-a9开发板模拟vexpress-a15开发板参考前言 本文介绍采…...

than的用法合集

首先需要了解一下than的词性&#xff0c;其有两个词性&#xff0c;一个是介词&#xff0c;一个是连词。 介词后面一定要接上名词性的词语&#xff0c;比如 i am taller then him 我比我的老师高 连词就比较自由&#xff0c;一般用来连接两个句子&#xff1b;但是使用than连词词…...

Unet 基于TCGA颅脑肿瘤MRI分割(高阶API分割模型)

目录 1. 介绍 2. dice 指标 3. resnet34 作为 backbone 的分割 4. deeplabv3 图像分割 4.1 问题 4.2 训练 4.3 预测 5. MAnet 图像分割...

[NIPS 2017] Improved Training of Wasserstein GANs (WGAN-GP)

Contents IntroductionDifficulties with weight constraintsCapacity underuseExploding and vanishing gradientsGradient penaltyReferencesIntroduction WGAN 增加了 GAN 模型训练的稳定性,但有时仍然会有生成质量不高或难以收敛的问题。作者发现上述问题经常是由 WGAN 中…...

力扣-每天的领导和合伙人

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1693. 每天的领导和合伙人二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.…...

考虑分配与合并,用GO实现GCMarkSweep

完整源码 ≧ω≦ 希望各位爸爸们&#xff0c;给我点赞吧 kokool/GCByGo: 《垃圾回收的算法与实现》有感而发 (github.com) 书接上文 我们之前不考虑分配与合并情况下&#xff0c;用GO实现GCMarkSweep&#xff08;标记清除算法&#xff09;&#xff0c;而这次我们继续回顾书本…...

浙江大学海宁IMBA提面经验分享

先来介绍一下我的个人情况&#xff1a;本人毕业于浙江一所普通的本科院校&#xff0c;毕业已经6年了&#xff0c;在一家互联网公司担任市场部经理。其实在参加浙大IMBA项目提面之前&#xff0c;我也参加了浙大MBA项目的提面&#xff0c;可惜只拿到了良好的结果&#xff0c;所以…...

Mybatis源码分析系列之第四篇:Mybatis中代理设计模型源码详解

一&#xff1a; 前言 我们尝试在前几篇文章的内容中串联起来&#xff0c;防止各位不知所云。 1&#xff1a;背景 我们基于Mybatis作为后台Orm框架进行编码的时候&#xff0c;有两种方式。 //编码方式1 UserDao userDao sqlSession.getMapper(UserDao.class); userDao.quer…...

JDBC的API详解

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、DriverManager 驱动管理类 1.注册驱动 2.获取数据库连接 二、Connection 数据库连接对象 1.获取执行对象 2.事务管理 三、Statement 1.执行DDL、DML语句 2.执行DQL语句 四、ResultSet 以JDBC快速…...

【深度强化学习】(4) Actor-Critic 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下深度强化学习中的 Actor-Critic 演员评论家算法&#xff0c;Actor-Critic 算法是一种综合了策略迭代和价值迭代的集成算法。我将使用该模型结合 OpenAI 中的 Gym 环境完成一个小游戏&#xff0c;完整代码可以从我的 GitHub 中获得&#xf…...

SQL注入——文件上传

目录 一&#xff0c;mysql文件上传要点 二&#xff0c;文件上传指令 一句话木马 三&#xff0c;实例 1&#xff0c;判断注入方式 2&#xff0c;测试目标网站的闭合方式&#xff1a; 3&#xff0c;写入一句话木马 4&#xff0c;拿到控制权 一&#xff0c;mysql文件上传…...

【ESP32+freeRTOS学习笔记之“ESP32环境下使用freeRTOS的特性分析(新的开篇)”】

目录【ESP32freeRTOS学习笔记】系列新的开篇ESP-IDF对FreeRTOS的适配ESP-IDF环境中使用FreeRTOS的差异性简介关于FreeRTOS的配置关于ESP-IDF FreeRTOS Applications结语【ESP32freeRTOS学习笔记】系列新的开篇 ESP-IDF对FreeRTOS的适配 FreeRTOS是一个可以适用于多个不同MCU开…...

Uipath Excel 自动化系列18-RefreshPivotTable(刷新透视表)

活动描述 RefreshPivotTable(刷新透视表)&#xff1a;如果透视表的数据源发生变化&#xff0c;需使用刷新透视表活动&#xff0c;该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用如下图&#xff1a; RefreshPivotTable(刷新透视表)属性 属性 作用 Display…...

设计模式之不变模式

在并行软件开发过程中&#xff0c;同步操作是必不可少的。当多线程对同一个对象进行读写操作时&#xff0c;为了保证对象数据的一致性和正确性&#xff0c;有必要对对象进行同步操作&#xff0c;但同步操作对系统性能有损耗。不变模式可以去除这些同步操作&#xff0c;提高并行…...

C++11 map

C11中Map的使用Map是c的一个标准容器&#xff0c;她提供了很好一对一的关系&#xff0c;在一些程序中建立一个map可以起到事半功倍的效果&#xff0c;总结了一些map基本简单实用的操作&#xff01;1. map最基本的构造函数&#xff1b;map<string , int >mapstring; map&l…...

docker基本命令 - 数据卷

作用 ● 做数据持久化。防止容器一旦停止运行&#xff0c;该容器中运行产生的数据就没了 ● 不同容器之间的数据共享(大鲸鱼背上各个小集装箱之间可以共享数据) 交互式命令使用 docker run -it -v / 宿主机的绝对路径目录:/容器内绝对路径目录 镜像名 docker run -it -v / 宿…...

SQL查漏补缺

有这么一道题&#xff0c;先看题目&#xff0c;表的内容如下 显示GDP比非洲任何国家都要高的国家名称(一些国家的GDP值可能为NULL)。 错误的查询&#xff1a; SELECT name FROM bbcWHERE gdp > ALL (SELECT gdp FROM bbc WHERE region Africa)正确的查询&#xff1a; SE…...

GeoServer部署实战与前端地图调用跨域配置详解

1. GeoServer快速部署指南 第一次接触GeoServer的朋友可能会觉得这个开源地图服务器有点神秘&#xff0c;其实它的安装比想象中简单得多。我在多个项目中部署过不同版本的GeoServer&#xff0c;总结出了一套最稳妥的安装流程。GeoServer本质上是一个基于Java的Web应用&#xff…...

不止于下载:用Active-HDL给你的Lattice FPGA设计做个“体检”(功能仿真实战)

从功能仿真到可靠设计&#xff1a;Active-HDL在Lattice FPGA开发中的深度实践 当LED灯在你的FPGA开发板上如期闪烁时&#xff0c;那种成就感确实令人振奋。但作为经历过多次调试煎熬的工程师&#xff0c;我必须告诉你&#xff1a;能下载运行只是FPGA开发的起点&#xff0c;而非…...

QQ音乐加密文件解密终极指南:qmcdump工具完整教程

QQ音乐加密文件解密终极指南&#xff1a;qmcdump工具完整教程 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾经…...

避坑指南:ArcGIS处理SRTM DEM时空间参考丢失、裁剪异常的终极解决方案

ArcGIS处理SRTM DEM数据避坑实战手册&#xff1a;从空间参考丢失到精准裁剪的全流程解析 当你从NASA官网下载了SRTM DEM数据&#xff0c;满心欢喜地准备进行地形分析时&#xff0c;是否遇到过这些"玄学"问题&#xff1f;裁剪后的中国地图边界莫名其妙偏移了几百公里&…...

B站视频转文字终极指南:3分钟学会用开源工具提取视频内容

B站视频转文字终极指南&#xff1a;3分钟学会用开源工具提取视频内容 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为手动记录B站视频内容而烦恼吗&…...

Armv8-A原子操作指令解析与应用优化

1. A64原子操作指令概述在Armv8-A架构中&#xff0c;A64指令集提供了一组强大的原子操作指令&#xff0c;这些指令在多核处理器环境下对实现线程安全的并发操作至关重要。原子操作的核心特性是保证特定内存操作的不可分割性——即这些操作要么完全执行&#xff0c;要么完全不执…...

规划求解(Solver)实战:利用Excel的Solver工具进行投资组合优化

投资界有句老话:"别把鸡蛋放在一个篮子里。"但很少有人告诉你后半句:“每个篮子放多少鸡蛋,才是大学问。“Solver就是投资组合的"营养师”,帮你配出最佳"营养比例”。就像投资界的红绿灯,约束条件告诉你什么可以做,什么不可以碰。 一、什么是规划求解…...

HDFS源码(二)

DataNode启动源码 创建HttpServer 初始化DataNode Rpc服务 获取NameNode Rpc代理 Datanode向NameNode注册 DataNode与NameNode周期心跳及block块汇报 数据上传源码 创建文件系统及初始化DFSClient 连接NN创建目录 启动DataStreamer线程 向dataQueue队列中写入packet 设置副本写…...

基于LLM的Python脚本自我进化:构建AI驱动的代码优化框架

1. 项目概述&#xff1a;当Python脚本学会自我进化几年前&#xff0c;如果有人告诉我&#xff0c;我写的Python脚本能在我喝咖啡的时候自己给自己“打补丁”、优化逻辑&#xff0c;我肯定会觉得这是科幻小说里的情节。但今天&#xff0c;这已经是我日常工作流的一部分。这个项目…...

元调优技术:如何让大模型学会严谨的数学推理与验证

1. 项目概述&#xff1a;当大模型遇上数学题作为一名长期混迹于AI工程一线的从业者&#xff0c;我经常被问到&#xff1a;“你们搞的大模型&#xff0c;做做文本生成还行&#xff0c;真让它解个数学题&#xff0c;能靠谱吗&#xff1f;” 这个问题问到了点子上。数学推理&#…...