案例(黑马)—— 登录+验证码

黑马点评part1 -- 短信登录 阅读详情

用户登录+验证码案例需求:

1、访问带有验证码的登录页面 login.jsp
2、用户输入用户名,密码以及验证码。

  • 如果用户名和密码输入有误,跳转到登录页面,提示:用户名或密码错误
  • 如果验证码输入有误,跳转到登录页面,提示:验证码错误
  • 如果全部输入正确,则跳转到主页 success.jsp,显示:用户名,欢迎您

开发步骤:

1、创建项目,配置文件,导入jar包。
2、编写登录的 login.jsp 页面。

注意:action中的路径为 /虚拟目录/servlet资源路径,

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
    
    <script>
        window.onload = function(){
            document.getElementById("img").onclick = function(){
                this.src="/case/checkCodeServlet?time="+new Date().getTime();
            }
        }
    </script>
    <style>
        div{
            color: red;
        }
    </style>
</head>
<body>

    <form action="/case/loginServlet" method="post">
        <table>
            <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="img" src="/case/checkCodeServlet"></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="登录"></td>
            </tr>
        </table>
    </form>

    <div><%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%></div>
    <div><%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error") %></div>

</body>
</html>
3、创建数据库 userlogin,创建表 user。
4、创建一个包com.qgl.domain,创建一个实体类User,实体类User 对应 user 表,该对象对应表中记录。
5、创建一个包com.qgl.util,创建数据库连接池对象和连接对象的工具类 JDBCUtils。
6、创建一个包com.qgl.dao,创建操作数据库的 UserDao 接口及 子包 impl 下的 UserDaoImpl 实现类。

上述代码查看:https://blog.youkuaiyun.com/longool/article/details/107007396

7、创建一个包com.qgl.web.servlet,创建处理登录数据的 loginServelt 类,验证码产生 CheckCodeServlet 类
package com.qgl.web.servlet;

import com.qgl.dao.UserDao;
import com.qgl.dao.impl.UserDaoImpl;
import com.qgl.domain.User;
import org.apache.commons.beanutils.BeanUtils;
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.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置编码
        req.setCharacterEncoding("utf-8");
        // 获取用户输入的验证码
        String checkCode = req.getParameter("checkCode");
        // 获取请求参数,封装user对象
        Map<String, String[]> pm = req.getParameterMap();
        User loginUser = new User();
        try {
            BeanUtils.populate(loginUser,pm);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        HttpSession session = req.getSession();
        // 得到系统产生的验证码
        String checkCode_session = (String) session.getAttribute("checkCode_session");
        // 获取后删除session中的验证码
        session.removeAttribute("checkCode_session");
        //4.调用UserDao的login方法
        UserDao dao = new UserDaoImpl();
        User user = dao.login(loginUser);

        // 判断验证码是否正确
        if (checkCode_session!=null && checkCode_session.equalsIgnoreCase(checkCode)){
            // 判断用户名与密码是否一致,即判断返回的user对象
            if(user == null){
                //登录失败
                req.setAttribute("login_error","用户名或密码错误");
                // 转发到登录页面,转发不需要虚拟目录
                req.getRequestDispatcher("login.jsp").forward(req,resp);
            }else{
                //登录成功
                //存储数据
                session.setAttribute("user",user.getUsername());
                //重定向
                resp.sendRedirect(req.getContextPath()+"/success.jsp");
            }
        }else{
            // 验证码不一致,存储提示信息到req
            req.setAttribute("cc_error","验证码错误");
            // 转发到登录页面,转发不需要虚拟目录
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
package com.qgl.web.servlet;

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;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    private int width = 100;
    private int height = 50;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建一个对象,用来在内存中画图
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        StringBuilder sb = new StringBuilder();

        // 美化图片
        // 填充矩形
        Graphics g = image.getGraphics();   // 获取画笔
        g.setColor(Color.PINK);             // 设置画笔颜色
        g.fillRect(0,0,width,height);
        // 画边宽
        g.setColor(Color.BLUE);
        g.drawRect(0,0,width-1,height-1);
        // 随机画字符
        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random rd = new Random();
        // 画干扰线
        for (int i = 1; i <8 ; i++) {
            int x1 = rd.nextInt(width);
            int x2 = rd.nextInt(width);
            int y1 = rd.nextInt(height);
            int y2 = rd.nextInt(height);
            g.drawLine(x1,x2,y1,y2);
        }
        // 画验证码
        g.setColor(Color.BLACK);
        for (int i = 1; i <=4; i++) {
            int index = rd.nextInt(str.length());
            char c = str.charAt(index);
            sb.append(c);
            g.drawString(c+"",width/5*i,height/2);
        }
        // 将验证码保存到session中
        String checkCode_session = sb.toString();
        req.getSession().setAttribute("checkCode_session",checkCode_session);
        // 输出图片到页面展示
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}
8、验证码、用户名和密码都正确后的重定向页面 success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1><%=request.getSession().getAttribute("user")%>,欢迎您</h1>
</body>
</html>

代码文件下载:https://download.youkuaiyun.com/download/longool/12562854

【EtherCAT实践篇一】TwinCAT 3安装、使用 FULL(XAE)安装包:包含了XAR的功能,并能进行多种语言的编程和硬件组态,通常安装在编程电脑上;XAR安装包:包含了ADS的功能,是实时运行环境,对 TwinCAT 模块进行加载、执行、管理、实时运行与调用,通常安装在PLC中;RM安装包:在装了高版本的TwinCAT 3后,发现PLC中的TwinCAT版本较低,就需要安装相应低版本的RM安装包切换版本使用(注:4024无法使用RM安装包切换到低于4022的版本,如4020/4018/4016版本。 阅读详情

相关推荐

OpenClaw 聪明设置指南(真实可用方案)

本文介绍了OpenClaw AI系统的配置与优化指南,主要内容包括:1)基础配置,涵盖初始化流程、安全设置和配置文件位置;2)模型分层策略,推荐主力模型与降级方案;3)性能优化,包括推理加速和内存管理;4)智能提升方法,如人格定义和技能安装;5)高级功能如多Agent协同和Token优化。文章提供了详细的配置命令和参数说明,帮助用户根据需求平衡性能与成本,实现高效AI助手部署。

qq_43344878的博客 710

Java在线教育项目 第九天黑马头条爬虫

day09_爬虫文档解析整合&数据保存准备 目标 能够完成爬虫初始化url的解析代码 能够完成个人空间页的解析 能够完成文章目标页的解析 能够进行整合测试 能够编写频道的保存及查询 1 文档解析 1.1解析规则工具类ParseRuleUtils com.heima.crawler.utils.ParseRuleUtils public class ParseRuleUtils { /** * 获取有效的抓取规则 * * @param html

fegus的博客 1007

[信号与系统]一阶与二阶连续时间系统和离散时间系统

定义:一阶连续时间系统由一阶线性常系数微分方程描述: dy(t)dt+ay(t)=bx(t) \frac{dy(t)}{dt} + a y(t) = b x(t) dtdy(t)​+ay(t)=bx(t)时间常数:时间常数 τ=1a\tau = \frac{1}{a}τ=a1​ 是系统响应速度的衡量指标。时间常数越小,系统响应越快。冲激响应:一阶系统的冲激响应是指数衰减或增长的形式。例如,对于一个单位冲激输入,响应为: h(t)=bae−at h(t) = \frac{b}{a} e^{-at} h(t)=

Andius的博客 2122

黑马头条Day3登录失败

在学习黑马头条第3天时,出现bug,一直登录不进去,并且也不报错,排查之后发现是nacos的配置出现了问题,为此分享出来,希望能够减少大家试错的时间。这两个name必须正确,错误的话,nacos也会连接成功,但是会找不到nacos上的配置,而且也不会报错。如果点击登录,一直提示手机号码错误,可以检查一下自己的nacos.然后还有一个点的话,是我看资料里给的nacos配置,像我这样就需要把media改成wemedia。扫描路径记得要和自己的写的路径要一致。如果没有启动服务端出现的情况是。

qq_41876834的博客 1246

Win10系统内存占用异常飙升?三步排查法快速定位问题根源

本文针对Win10系统内存占用异常飙升问题,提供了一套三步排查法。首先利用任务管理器和资源监视器进行深度系统体检,定位隐形内存消耗者;其次通过干净启动和禁用非必要后台服务,揪出导致内存泄漏的第三方软件或驱动;最后进行终极深度清理,包括检查内存完整性、调整虚拟内存设置以及更新关键驱动程序,帮助用户快速恢复系统流畅运行。

weixin_29251567的博客 196

15、SQL Server查询优化与CPU负载管理

本文深入探讨了SQL Server查询优化与CPU负载管理的关键技术,包括强制连接类型的使用、键查找问题的解决、索引设计的最佳实践、高CPU负载的排查与优化,以及并行性的利弊与调整策略。通过优化查询逻辑、合理设计索引、监控与管理CPU资源,可以显著提升SQL Server的性能和稳定性。适用于数据库开发人员和DBA进行性能调优参考。

pz8901234的博客 80

黑马头条项目(一):APP用户登录

黑马头条项目(Day01)中需要注意的知识点梳理

qq_34404870的博客 851

Ceph入门到精通-更换osd、扩容osd

【代码】Ceph入门到精通-更换osd、扩容osd。

隔壁老瓦的专栏 1548

微服务项目实战-黑马头条(一):环境搭建 + APP登录功能【前端静态资源+nginx反向代理+网关+过滤器】

heima-leadnews-service的pom文件解析引导类UserApplicationimport org} }} }} }MapperScan;

shendaiyan的博客 3422

STM32F407+OV2640的DCMI+DMA双缓冲JPEG图像采集系统

在嵌入式视觉系统中,数字摄像头接口(DCMI)是MCU连接CMOS图像传感器的关键硬件通道,其与DMA协同实现零CPU干预的高速数据流采集;而JPEG作为一种基于DCT变换与量化压缩的有损图像格式,依赖传感器端硬件编码引擎才能满足实时性要求。理解DCMI三重同步时序(PCLK/HSYNC/VSYNC)与DMA双缓冲机制的流水线协作原理,是突破带宽瓶颈、避免FIFO溢出和帧丢失的技术基础。该架构广泛应用于智能硬件、工业检测与边缘AI前端等需低功耗、高可靠图像捕获的场景,本文以OV2640与STM32F407为

weixin_42103128的博客 157

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro

Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 548

案例(黑马)—— 简单验证码

package com.qgl.web.servlet; 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.Ht

longool的博客 641

详细分析 Bladex中的swagger-resources资源未授权访问的解决方法

有如下方式,网关过滤、去除配置以及修改代码还有隐藏彩蛋(附Demo),推荐阅读

码农研究僧的博客 1727

黑马登录案例验证码无法正常显示原因

验证码图片输出格式不对 //将内存中的图片输出到浏览器 //参数一:图片对象 //参数二:图片的格式,如PNG,JPG,GIF //参数三:图片输出到哪里去 ImageIO.write(image,"PNG",response.getOutputStream()); 改为 ImageIO.write(image,"jpg",response.getOutputStream()); CheckCodeServlet .jav

zhansan的博客 1488

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

黑马JAVA P80 String案例:验证码、登录、隐私号码

package com.itheima.string; import java.util.Random; public class StringExec8 { /** * 练习题:使用string完成随机生成5位的验证码。 */ public static void main(String[] args) { //1.定义出现的字符信息 String datas = "abcdefghijklmnopqrstuvwxyzA...

weixin_51015079的博客 646

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaWeb使用Response和Servlet生成验证码案例_黑马javaweb案例

servlet实现简单的验证码生成/用到Response知识

记录分享编程与冲浪知识 340

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

5、Ajax

文章目录Day01_Ajax入门知识点自测目录学习目标01.AJAX 概念和 axios 使用目标讲解小结02.认识 URL目标讲解小结03.URL 查询参数目标讲解小结04.案例-查询-地区列表目标讲解小结05.常用请求方法和数据提交目标讲解小结06.axios 错误处理目标讲解小结07.HTTP 协议-请求报文目标讲解小结08.请求报文-错误排查目标讲解小结09.HTTP 协议-响应报文目标讲解小结10.接口文档目标讲解小结11.案例-用户登录-主要业务目标讲解小结12.案例-用户登录-提示信息目标讲解

m0_73087260的博客 992

2024 校园点餐订餐外卖跑腿Java源码

一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,又避免了单页面应用在SEO方面的不足。因此,这种架构有望在未来广泛应用于各类项目中。环境要求:JDK 8MavenMySQL 5.7。

401

Postman实战:接口测试中的登录鉴权与异步订单流深度解析

接口测试是软件质量保障的核心环节,它通过模拟客户端请求来验证服务端API的功能、性能与安全性。其基本原理在于遵循HTTP协议,构造请求并校验响应,确保数据交互的准确性与业务逻辑的正确性。在技术价值层面,完善的接口测试能提前发现系统集成问题,保障数据一致性,并提升开发交付效率。尤其在电商、金融等涉及交易与用户状态的领域,登录鉴权与异步订单流是两大关键测试场景。登录鉴权关乎系统安全,涉及Token管理、会话保持与加密验证;而异步订单流则考验系统在并发与异常处理下的稳定性和数据一致性。本文将以一个典型的点评类项目

weixin_28677451的博客 257

校园点餐订餐外卖跑腿Java源码

请注意,application.yaml 中的 reggie: path: 是指定图片存储路径的,默认配置为 D 盘下的 outTakeImage。一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。验证码登录(模拟验证码)

weixin_44449288的博客 66

黑马旅游网 —— 登录/注册案例

刚学习了一个Session案例,即服务器端会话技术案例,做完案例之后, 突然想将之前学习前端技术的案例和这个结合起来,于是就有了这个项目。将tomcat集成到IDEA中,创建JavaEE项目,部署web项目,结合了Servlet、MySQL、JSP和Bootstrap技术。

好想躺平。。。 2883

黑马瑞吉外卖之移动端验证码登录使用qq邮箱

pc端的后台管理我们剩下有订单明细还没有进行开发,由于订单这边需要移动端下单后才可以看到订单,所以我们需要去先在移动端开发一些功能后,再回过头让订单这边进行一个展示。 首先移动端开发的话,我们首先遇到的应该就是登录的问题。移动端登录这边我们验证码发送的话我们这边采用qq邮箱的验证码进行登录。既然是用户登录这里的话,其实我们还需要这样对应的数据模型。我们先看前端页面代码 这里给到的登录页面这里,其实我们可以稍微修改一下,之前这里是提示的输入的手机号码,我们这里要用qq邮箱验证登录的话,其实我们可以要求输入邮

jgdabc的博客 7154

【黑马点评】短信登录模块

【黑马点评】短信登录模块

yi711711的博客 2188

【Redis黑马点评】基于session实现登录【短信验证码登录、登录验证功能、拦截器】过程详解

这篇文章详细介绍了一个基于SpringBoot和MySQL的Redis项目实践,涵盖了从开发环境搭建到具体功能实现的全过程。开发环境搭建通过MySQL数据库的配置,导入SQL文件实现数据的初始化。搭建SpringBoot项目并成功加载数据,确保后端服务正常运行。配置前端Nginx服务器,确保前端页面可以正常访问。基于Session的登录功能实现文章通过发送短信验证码来验证用户的身份,并将验证码保存到Session中,以保证验证码的有效性。

一键难忘的博客 3616

黑马点评--短信登录实现

ThreadLocal就可以解决该问题,ThreadLocal是一个线程域对象,每一个进入Tomcat的请求都是一个独立的线程,而ThreadLocal的核心作用就是让每一个线程都有自己的数据副本,避免共享资源引发的竞态条件,这样就可以让每一个线程都有对应的独立内存空间取保存对应用户,线程之间互不干扰,因此无论几条请求访问哪些Controller都可以做到独立线程,都有自己的独立用户信息,当需要用户信息时,则Controller从ThreadLocal中取出用户即可。是一种前后端分离的架构。

m0_73856804的博客 1571

黑马点评项目01——短信登录以及登录校验的细节

本文介绍了两种短信登录实现方式: Session方式: 通过session存储验证码和用户信息 使用ThreadLocal保存用户信息实现拦截器校验 缺点是不适合分布式环境 Redis方式: 使用Redis存储验证码和用户信息 验证码设置3分钟有效期 使用UUID生成token作为Redis键 通过请求头携带token进行登录校验 两种方式对比了实现细节,Redis方案解决了Session在分布式环境中的共享问题,更适合现代应用架构。文中还解释了RedisTemplate和StringRedisTempla

csdn_l_z的博客 2742
上一篇: 案例(黑马)—— 简单验证码
下一篇: JSP、EL表达式、JSTL
ShareBeHappy_Qin
博客等级 码龄9年 2321粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值