登录验证码由servlet实现

2023-11-05

简单的登录验证码由servlet实现

  1. 创建包util,类ImageServlet
    在这里插入图片描述
package util;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageServlet extends HttpServlet {
    public ImageServlet() {
        super();
    }

    @Override
    public void destroy() {
        super.destroy();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        int width=78;
        int height=20;
        //创建对象
        BufferedImage bim=new BufferedImage(68,20,BufferedImage.TYPE_INT_RGB);
        /*
        获取图片对象bim的图形上下文对象g,这个g的功能如同一支绘图笔,程序中使用这支笔来绘制、修改图片对象bim
        */
        Graphics g=bim.getGraphics();
        Random rm=new Random();
        g.setColor(new Color(rm.nextInt(100),205,rm.nextInt(100)));
        g.fillRect(0,0,width,height);
        StringBuffer sbf=new StringBuffer();
        //输出数字
        for(int i=0;i<4;i++){
            g.setColor(Color.black);
            g.setFont(new Font("微软雅黑",Font.BOLD|Font.ITALIC,22));
            int n=rm.nextInt(10);
            sbf.append(n);
            g.drawString(""+n,i*15+5,18);
        }
        //生成的验证码保存到session中
        HttpSession sn=req.getSession();
        sn.setAttribute("piccode",sbf);
        //禁止缓存
        resp.addHeader("Prama","no-cache");
        resp.setHeader("Coche-Control","no-cache");
        resp.setDateHeader("Expires",0);
        resp.setContentType("image/jpeg");
        //将bim图片以"jpg"格式返回给浏览器
        ImageIO.write(bim,"JPG",resp.getOutputStream());
        resp.getOutputStream().close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    @Override
    public void init() throws ServletException {
        super.init();
    }
}

2.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>ImageServlet</servlet-name>
        <servlet-class>util.ImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ImageServlet</servlet-name>
        <url-pattern>/ImageServlet</url-pattern>
    </servlet-mapping>
</web-app>

3.创建登录界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
    <script>
        function reloadImage(t) {
              t.src="ImageServlet?flag="+Math.random();
        }
    </script>
</head>
<body>
    <div align="center">
    <form action="checkUser.jsp" method="post">
        <table bgcolor="#e7daff">
            <tr><td colspan="2" align="center">用户登录</td></tr>
            <tr><td>用户名:</td>
                <td><input type="text" name="user"></td>
            </tr>
            <tr><td>密码:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr><td>验证码</td>
                <td><input type="text" name="checkcode">
                    <img src="ImageServlet" align="middle" alt="看不清,点击这里!" onclick="reloadImage(this)"></td>
            </tr>
            <tr><td colspan="2" align="center"><input type="submit" value="登录"></td></tr>
        </table>
    </form>
    </div>
</body>
</html>

4.创建javabean,里面java代码用来连接数据库,与jsp部分相分离来

package bean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBcon {
    private String str="com.mysql.cj.jdbc.Driver";
    private String root="root";
    private String password="2001223";
    private String url="jdbc:mysql://localhost:3306/users";
    public Connection getconnection() throws ClassNotFoundException, SQLException {
        Class.forName(str);
        return DriverManager.getConnection(url,root,password);
    }
}

5.创建登录验证的jsp文件

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="db" class="bean.DBcon" scope="request"></jsp:useBean>
<html>
<head>
    <title>登录验证</title>
</head>
<body>
    <%
        request.setCharacterEncoding("utf-8");
        String username=request.getParameter("user");
        String password=request.getParameter("password");
        String checkcode=request.getParameter("checkcode");
        String piccode=request.getSession().getAttribute("piccode").toString();
    %>
            你输入的验证码是:<%=checkcode%><br>
            由servlet生成的验证码是:<%=piccode%><br>
            你输入的用户名是:<%=username%><br>
            你输入的密码是:<%=password%><br><hr>
    <%
        Connection con=db.getconnection();
        Statement stmt=con.createStatement();
        String sql="select * from userinfo";
        sql+=" where loginname='"+username+"' and password='"+password+"'";
        ResultSet rs=stmt.executeQuery(sql);
        if(checkcode.equals(piccode)&&rs.next()){
            session.setAttribute("userName",username);
            out.print("<span style='color:green'>恭喜你,验证通过!</span><br><br>");
            out.print("<a href='main.jsp'>转向主页面</a>");
        }else {
            out.print("<span style='color:red'>验证错误或无此用户或密码错误,登录失败!</span><br>");
            out.print("<a href='login.jsp'>重新登录</a>");
        }
    %>
</body>
</html>

6.运行效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

登录验证码由servlet实现 的相关文章

  • 如何将模糊屏幕设置为整页并在点击页面时转到顶部

    CSS1 有效 parentDisable z index 2000 width 100 height 100 display none position absolute left 0 background url images btra
  • 如何在 Safari 上打开本地 html 文件?

    我想打开本地 html 文件Safari集成到我的Swift 3应用 我知道如何使用网址来做到这一点 这是我用来执行此操作的代码 let encodedString url addingPercentEncoding withAllowed
  • 不要让最终用户保存密码[重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器 保存密码 功能 https stackoverflow com questions 32369 disable browser save password functionality 是否
  • 监听服务响应 JavaScript

    背景 我正在为网页制作 Chrome 扩展程序 在此网页中 我需要捕获用户发出 POST 请求时服务器发送的响应 目前 我们使用观察者模式来检查 HTML 页面上的更改 但这很笨拙并且会触发多次 客观的 我需要捕获该响应 相应地解析其信息
  • 下拉 24 小时选项值和 12 小时显示

    我需要创建一个时间数组 以便在 HTML 下拉列表中使用 数组键应采用 24 小时格式 值应采用 12 小时制 包含 am 和 pm 在数据库中我想存储 24 小时格式 有没有一种快速的方法来创建数组而不是每小时键入 example 00
  • 垂直对齐两个弹性项目[重复]

    这个问题在这里已经有答案了 我有一个弹性容器 container和两个弹性项目 item one and item two 我想将第一个项目垂直居中并将第二个项目粘在底部 我不知道如何在这种情况下垂直对齐第一项 HTML div class
  • IE10中的图像插值

    这是我的用例 我有一个采用响应式设计的网页 该页面垂直分成两半 我想在右侧显示图像 呈现为 PNG 或 JPG 的 PDF 页面 调整窗口大小后 图像的大小应立即更改 我以为我已经解决了这个问题 我将服务器上的图像渲染得足够大 以适应最大可
  • 未捕获的类型错误:无法读取未定义的属性“prop”

    我有 6 个输入复选框 如果选中的复选框超过 3 个 则最后一个复选框将被取消选中 为了更好地理解 请参阅我之前的question https stackoverflow com questions 35195235 if checkbox
  • Intro.js 2页然后返回首页

    我在用intro js http introjs com 为我的网站创建一个小介绍 我希望游览从第 1 页 主页 2 另一页 然后回到第 1 页 主页 我已经成功地从第 1 2 页开始 但不确定如何让它返回到第 1 页 我对 javascr
  • Onblur 事件在另一个 div 的 onclick 之前触发

    如上所述 我有一个按钮 单击该按钮将打开子菜单 对于子菜单中的每个选项 都有三个元素 我认为实际上还有更多元素 但为了简单起见 将其保留为 3 我将焦点放在子菜单的主 div 白色 框架 上 Onblur 这个 div 然后我隐藏子菜单 这
  • Twitter Bootstrap - 多图像(缩略图)轮播 - 一次移动一个缩略图

    我正在尝试 Twitter bootstrap 3 我对 HTML CSS 和 Javascript 还很陌生 我有一个我创建的轮播 它的代码如下所示 div class container div class carousel slide
  • 在 HTML5 中使用 JS 创建内联 SVG

    我正在使用本地 HTML5 文件 它有在顶部 我在里面放了这样的东西
  • 第一次从按钮提交时,只有单击两次后才会打开模态框

    我有一个模式弹出窗口可以通过单击按钮打开 不幸的是 当第一次在浏览器中提交时 我只能在单击两次后才能看到弹出窗口 但是 一旦弹出窗口打开并关闭 我就可以在下一次尝试中单击一次来打开模式 如果我刷新浏览器也会发生同样的情况 这看起来很奇怪 任
  • 清理 html 字符串中的所有脚本

    HTML5 剪贴板很棒 但我正在寻找一种使其安全的方法 用户正在将文本 html 粘贴到我的网页中 这允许他们粘贴图像 表格等 我正在寻找一种方法 在将粘贴的内容添加到页面之前删除所有脚本 我需要删除
  • CSS:如何在模糊的背景上剪切文本?

    我想重新创建以下样式 我想出了以下内容 问题是剪切不会影响模糊滤镜 我不知道如何解决它 这是我的 HTML 代码 glass width 40 height 100 position absolute background rgba 255

  • 有多少像素? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 一个有多少像素 br 标签添加 我知道 br 高度可以通过CSS控制line height财产 不同浏览器的值是否相同 它会添加与浏览
  • 如何仅突出显示嵌套表的最里面的表行?

    我有几个嵌套表 我想突出显示鼠标指针下方的最里面的行 我怎样才能做到这一点 一些提示 我使用嵌套表来显示递归表格数据 表可以嵌套 10 层 嵌套正如您所期望的那样 table tr td table tr td table tr td 可能
  • 获取 byte[]

    我有一个 html 画布 如下所示 output is a base64string of image data var oldImage new Image oldImage onload function var resizeRatio
  • window.open 使用 css 样式

    我想设计我的 window open 目前 我的网页上有一些项目由于解析了某个类而打开 然后在新窗口中打开指定的文本 我想更改字体大小 字体和填充等 这是我的 JavaScript 代码
  • 使用 div 或表格来包含链接列更好吗?

    我的页面底部有 3 列链接 每列都放入一个 div 中 所有三个 div 都包装在页面中央的一个大 div 中 这是更适合桌子的东西还是桌子不适合这项工作 您还可以使用 ul http www w3schools com tags tag

随机推荐

  • UEFI 之 Capsule Update (固件更新)

    概要 什么是UEFI Capsule Update呢 Capsule 顾名思义 是 胶囊 的意思 所以UEFI Capsule Update可以理解为胶囊式固件更新 UEFI规范定义了Firmware Management Protocol
  • 【华为OD机试真题 JS】靠谱的车

    标题 靠谱的车 时间限制 1秒 内存限制 262144K 语言限制 不限 程序员小明打了一辆出租车去上班 出于职业敏感 他注意到这辆出租车的计费表有点问题 总是偏大 出租车司机解释说他不喜欢数字4 所以改装了计费表 任何数字位置遇到数字4就
  • [Scala]001-初识

    Scala 发音 sk l 取自于 Scalable 可伸缩 可扩展的 Language简写 01 基本概念 1 多范式 多种编程方法 目前有四种程序设计方法 面向过程 面向对象 函数式 泛型 编程范式 programming paradi
  • latexit使用教程

    必备条件 下载MacTex mpkg zip并安装 写好test bib文件和test tex文件
  • Flutter一天一控件之ListTile(列表的实现)

    ListTile简介 Flutter中的ListTile控件是一种常用的列表项控件 它可以用于显示列表中的每一个项 通常包含标题 副标题 图标等内容 ListTile控件的外观和行为类似于Android中的ListView中的列表项 一个简
  • 基于相干解调法和基于相位比较法的2DPSK数字通信系统 MATLAB Simulink仿真

    1 课程设计目的 通过课程设计 巩固已经学过的通信原理课程中有关数字调制系统的知识 加深对相关知识的理解和应用 学会应用Matlab Simulink工具对通信系统进行仿真和调试 设计与实现的过程中充分利用图书馆和网络资源 提高发现问题和自
  • linux虚拟机中和主机三种网络连接方式的区别

    在介绍网络模式之前 关于网络的几个简单命令的使用 ifup eth0 启动网卡eth0 ifdown eth0 关闭网卡eth0 etc network interfaces 网络配置文件 etc init d networking 网络服
  • 软件实训之从调研到设计,产品设计的从0到1

    软件实训之从调研到设计 产品设计的从0到1 内容关键词 调研 设计 产品 课程 软件项目实训 授课老师 张森鹏 新浪ID sunlifestyle 中城投丝路 720科技 知识来源 网络资源汇总整理 张森鹏讲课视频汇总整理 在互联网产品开发
  • 滴滴社招三面(已拿offer)

    一面 项目 基础技术 算法都有 项目部分 1 业务流程 2 具体负责的部分 3 工作职责 4 碰到的问题 以及怎么解决的 每个问题展开说 技术部分 1 JVM内存模型 具体细节 结合实际说每个空间的作用 2 哪些垃圾回收算法 各个垃圾回收器
  • 如何给家人购买保险

    一 保险的本质 保险是为了防范 分散风险 保险的本质是杠杆 是风险对冲 和风险转移工具 杠杆 用低成本的投入 获得风险发生时 高额的索赔 买保险就是买一份协议 一纸合同 二 保险的分类 保险主要有两大类 分别是社会保险和商业保险 社会保险主
  • 计算机网络重点知识解析(2)

    计算机网络重点知识的总结 接上一篇文章 文章目录 HTTP协议 HTTP协议简介 HTTP请求响应的步骤 HTTP常见状态码 GET请求和POST请求 Cookie和Session HTTPS协议 Socket 简介 总结 HTTP协议 h
  • Mybatis的xxxMapper.xml文件节点的statementType属性说明

    概述 在xxxMapper xml文件中可以使用statementType标记使用什么的对象操作SQL语句 说明 StatementType取值说明 1 STATEMENT 直接操作sql 不进行预编译 获取数据 gt gt Stateme
  • 给模型的模块添加触摸点击等交互事件

    给camera添加组件 Component Event Physics Raycaster 给模型添加碰撞体 选中要交互的模块 Component Physics Box Collider 调整collider的size直到合适 最后同时给
  • Windows下python(conda)加载spatialite模板

    如果在python调用spatialite的函数 报错no such function MBRContains ST Contains python则需要加载spatialite扩展 共两步 1 先在The Gaia SINS federa
  • java创建request_java ->HttpServletRequest

    HttpServletRequest HttpServletRequest概述 我们在创建Servlet时会覆盖service 方法 或doGet doPost 这些方法都有两个参数 一个为代表请求的request和代表响应response
  • [JSP暑假实训] 三.MySQL数据库基本操作及Servlet网站连接显示数据库信息

    本系列文章是作者暑假给学生进行实训分享的笔记 主要介绍MyEclipse环境下JSP网站开发 包括JAVA基础 网页布局 数据库基础 Servlet 前端后台数据库交互 DAO等知识 前一篇文章讲解了MyEclipse环境下创建JSP注册表
  • Java锁性能提高(锁升级)机制总结

    锁的使用很难避免 如何尽量提高锁的性能就显得比较重要了 锁偏向 所谓的偏向锁是指在对象实例的Mark Word 说白了就是对象内存中的开头几个字节保留的信息 如果把一个对象序列化后明显可以看见开头的这些信息 为了在线程竞争不激烈的情况下 减
  • 机器学习极好的入门学习视频推荐

    首先说明本人最早看的机器学习视频是吴恩达的机器学习后来发现并不适合我 如果你以前了解过一些算法 不妨看看我以下推荐的视频 对于一点都不了解机器学习的小白 那就更要看我推荐的视频了 当然吴恩达的机器学习也很好 但是相信我 看下面我推荐的视频是
  • wikiextractor 提取维基百科语料报错的解决办法

    我提取维基百科语料的时候 刚开始使用的wikiextractor 后来发现总是报错 于是就没有用了 由于很多人都在问我是怎么提取的 现在把代码公布下 代码不是我写的 是从一个网站找到的 由于太久了 忘记了网站的地址 就没办法贴原网址了 如果
  • 登录验证码由servlet实现

    简单的登录验证码由servlet实现 创建包util 类ImageServlet package util import javax imageio ImageIO import javax servlet ServletException