Java Web实用开发技术-图形验证码

2023-11-07

图形验证码生成(地址为checkcode)

package servlet;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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;



/**
 * Servlet implementation class CheckCode
 */
@WebServlet("/checkcode")
public class CheckCode extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CheckCode() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("image/jpeg");
		HttpSession session=request.getSession();
		int width=60;
		int height=30;
		//设置浏览器不要缓存此图片
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no=cache");
		response.setDateHeader("Expires", 0);
		//创建内存图像并获得其图形上下文
		BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		Graphics g=image.getGraphics();
		//产生随机验证码
		//定义验证码的字符表
		String chars="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
		char[] rands=new char[4];
		for(int i=0;i<4;i++){
			int rand=(int)(Math.random()*62);
			rands[i]=chars.charAt(rand);
		}
		//产生图像
		//画背景
		g.setColor(new Color(0xDCDCDC));
		g.fillRect(0, 0, width, height);
		//随机产生120个干扰点
		for(int i=0;i<120;i++){
			int x=(int)(Math.random()*width);
			int y=(int)(Math.random()*height);
			int red=(int)(Math.random()*255);
			int green=(int)(Math.random()*255);
			int blue=(int)(Math.random()*255);
			g.setColor(new Color(red,green,blue));
			g.drawOval(x, y, 1, 0);
		}
		g.setColor(Color.BLACK);//设置字体为黑色
		g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
		//在不同的高度上输出验证码的不同字符
		g.drawString(""+rands[0], 1, 17);
		g.drawString(""+rands[1], 16, 15);
		g.drawString(""+rands[2], 31, 18);
		g.drawString(""+rands[3], 46, 16);
		g.dispose();
		//将图像输出到客户端
		ServletOutputStream sos=response.getOutputStream();
		ByteArrayOutputStream baos=new ByteArrayOutputStream();
		ImageIO.write(image, "JPEG", baos);
		byte[] buffer=baos.toByteArray();
		response.setContentLength(buffer.length);
		sos.write(buffer);
		baos.close();
		sos.close();
		//将验证码放到session中
		String str=new String(rands);
		session.setAttribute("checkCode", str);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request,response);
	}

}

登录页面(输入界面.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<script type="text/javascript">
	function refresh(){
		document.getElementById("img1").src="checkcode?a="+Math.random();
	}
</script>
<body>
<form method="get" name="form1">
用户名:<input type="text" name="userid"
	 onclick="mes.innerHTML=''"value="${param.userid}"/><br>
密码:<input type="password" name="userpwd" value="${param.userpwd}"/><br>
验证码:<input type="text" name="checkcode" />
<img border="0" src="checkcode" id="img1"/>
<input type="submit" value="换一张" onclick="refresh()"/><br>
<input type="submit" value="登录" onclick="form1.action='logcheck'">
<input type="reset" value="重置">
<div id="mes">${info}</div>
</form>
</body>
</html>

处理登录请求的servlet(地址为logcheck)

package servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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;

/**
 * Servlet implementation class LogCheck
 */
@WebServlet("/logcheck")
public class LogCheck extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LogCheck() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		String userid=request.getParameter("userid");
		String userpwd=request.getParameter("userpwd");
		String usercheckcode=request.getParameter("checkcode");
		String info="";
		HttpSession session=request.getSession();
		String servercheckcode=(String)session.getAttribute("checkCode");

		if(servercheckcode==null){
			info="验证码为空!";
		}
		else if(!servercheckcode.equalsIgnoreCase(usercheckcode)){
			info="验证码不正确,请重新输入";
		}else if("张三".equals(userid)&&"123".equals(userpwd)){
			info="登录成功!";
		}else{info="用户名或密码错误!";}
		request.setAttribute("info", info);
		RequestDispatcher rd=request.getRequestDispatcher("/输入界面.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request,response);
	}

}

其中两个servlet之间的传参也可使用request

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

Java Web实用开发技术-图形验证码 的相关文章

随机推荐

  • stm32f4xx-WWDG窗口看门狗

    文章目录 一 窗口看门狗 1 窗口看门狗框图 2 看门狗工作过程中 3 为什么要窗口看门狗 4 窗口看门狗配置 二 test 一 窗口看门狗 在系统复位后 看门狗总是处于关闭状态 可通过设置WWDG CR寄存器中的WDGA位来使能看门狗 之
  • 一、基础介绍

    文章目录 1 知识框架介绍 2 策略篇介绍 3 理论篇介绍 1 知识框架介绍 2 策略篇介绍 量化投资的主要内容包括 量化选股 量化择时 股指期货套利 商品期货套利 统计套利 期权套利 算法交易 ETF LOF套利 高频交易等 投资策略总的
  • 监控告警03--夜莺新增飞书告警模块-v4版本

    监控告警03 夜莺新增飞书告警模块 v4版本 1 介绍 2 方法 2 1 源码变动 2 2 测试效果 3 说明 1 介绍 上文 监控告警02 夜莺飞书告警 v4版本 中 笔者通过更改夜莺 v4 源码 src modules server d
  • Java随机生成8位字符串

    转载 http www aichengxu com java 6875596 htm 因业务需要 使用UUID生成32位的字符串有点长 这个生成8位的字符串方案可行 public static String chars new String
  • 使用 Visual Studio 2022 写纯32位汇编(intel风格)

    文章目录 第0步 打开VS 2022 点击创建新项目 第1步 选择windows 桌面向导 第2步 配置项目 第3步 选择空项目 第4步 找到生成依赖项 选择生成自定义 第5步 勾选masm 第6步 新建文件 第7步 选择cpp文件并在下方
  • Mac 如何安装 redis(两种方式)

    Mac 如何安装 redis 通过HomeBrew包管理工具安装 不知道什么是HomeBrew的可以去看这一篇文章 安装完HomeBrew后 通过下面命令来查看redis版本 brew search redis 通过 来指定版本 上面没指定
  • 图像识别中,目标分割、目标识别、目标检测和目标跟踪这几个方面区别是什么?+资料列表

    目标识别 深度学习进行目标识别的资源列表 转 https zhuanlan zhihu com p 26076489 以下转自 https www zhihu com question 36500536 作者 知乎用户 链接 https w
  • 【Redis】--缓存双写一致性分析、解决方案

    目录 一 缓存双写一致性场景 1 先更新数据库 再更新缓存 2 先更新数据库 再删除缓存 2 1 存在的问题一 删除缓存失败 导致Redis和mysql的数据不一致 2 2 存在的问题二 删除缓存成功 但mysql主从时延问题 导致读操作回
  • IPX:互联网分组交换协议--网络大典

    互联网分组交换协议 IPX 是 Novell NetWare 操作系统所支持的在互联网中传送数据包的遗留网络协议 IPX 是一种面向无连接通信的数据报协议 类似于 TCP IP 协议组中的网际协议 IP 高层协议如 SPX 和 NCP 主要
  • SORT目标追踪算法详解

    SORT目标追踪 文章目录 SORT目标追踪 前言 一 卡尔曼滤波器 1 迭代算法 2 数据融合 3 协方差矩阵 4 状态空间表达 5 卡尔曼滤波详细推导 前言 SORT Simple Online and Realtime Trackin
  • 基于OpenCV的视频处理管道

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 目前可依靠模块化方式实现图像处理管道 检测一堆图像文件中的人脸 并将其与漂亮的结构化JSON摘要文件一起保存在单独的文件夹中 让我们对视频流也可以进行同样的操作 为此 我
  • 简单说下docker的pull 和 push

    pull 镜像的元信息与镜像层数据分开存储 当 pull 一个镜像时 先进行认证获取到 token 并授权通过 然后获取镜像的 manifest 文件 进行 signature 校验 校验完成后 依据 manifest 里的层信息并发拉 取
  • 【Matlab】在Matlab绘图中添加数学公式(分式等)(LaTaX)

    利用matlab绘图时有时需要在图中标注公式 或在图片title 坐标轴名称也包括公式之类的 使用这种方法都可以进行添加 通常直接编辑只能识别k 1 beta之类的word公式中直接可输入的那种 较为复杂的公式 尤其是分式 使用LaTeX编
  • sql注入第11关

    这关采用post的方式传参 定闭合符 使用 or 1 1 回显正常 使用 or 1 1 回显报错 可以尝试更多的闭合符 这里就不一一实现了 实现原理 查询列数 admin order by 2 order by 3 所以有两列 找显示位 查
  • git管理修改、撤销修改和删除文件

    一 管理修改 git管理的是修改 而不是文件 修改可以是新增一行 删除一行 添加某些字符 删除某些字符 删除文件或新建文件等 现在我们修改文件sample txt 然后使用git add命令将文件提交至暂存区 vim sample txt
  • 2022CTFSHOW菜狗杯部分题目(三)

    MISC 一层一层一层地剥开我的 ctfshow RAR文件头修复 docx 文件分离 base100 下载附件 打开发现是个word文档 改zip后缀为docx 打开后发现是一堆符号 全选内容修改字体 拿到以下内容 是 一闪一闪亮晶晶 的
  • Vim神级插件: EasyMotion

    Vim的移动操作很强大 hjkl左下上右 wb按词移动 fF前后搜索等等 方便 快速 但也有软肋 跨越多行的精确跳转就相当不尽人意 幸好 有一款堪称神级表现的插件 EasyMotion 简单说 它提供了一组对应默认移动操作的键绑定 能搜索并
  • 借助neo4j-admin导入csv文件构建实体与联系

    文章目录 1 CSV 导入的文件格式 数据类型 实体csv文件 关系csv文件 2 CSV 导入 neo4j 案例 不同导入工具的区别 1 CSV 导入的文件格式 官方DOC https neo4j com docs operations
  • 盲打打字php,盲打键盘指法图顺口溜及练习方法

    在当今社会盲打已经是必须会的技能了 还没学会的新手们 在这里教你们一个快速学会盲打的方法 希望可以给大家带来参考与帮助 盲打键盘指法图顺口溜 顺口溜一 左手食指RFV 还有TGB紧相随 左手中指EDC 无名指WSX来应对 左手小指QAZ 遵
  • Java Web实用开发技术-图形验证码

    图形验证码生成 地址为checkcode package servlet import java awt import java awt image BufferedImage import java io ByteArrayOutputS