`

java-web绘制验证码图片例程

 
阅读更多

页面html代码:

<%@ 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>Insert title here</title>
<script type="text/javascript">
	function changeImage() {
		document.getElementById("randomCode").src = "/randomCode?"
				+ Math.random();解决点击验证码没有反应问题
	}
</script>
</head>
<body>
	<form action="/login" method="post">
		用户名:<input name="username" type="text"><br /> 密码:<input
			name="password" type="password"><br /> 验证码:<input name="code"
			type="text"><img alt="" src="/randomCode" id="randomCode"
			style="cursor: pointer;" onclick="changeImage()"> ${error}<br />
		<input type="submit" value="登录">
	</form>
</body>
</html>


java代码:

package test.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;

public class LoginServlet extends HttpServlet {
	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String code = request.getParameter("code");
		String randomCode = (String) request.getSession().getAttribute(
				"randomCode");
		if (StringUtils.equalsIgnoreCase(code, randomCode)) {
			System.out.println("执行正常的业务逻辑");
		} else {
			request.setAttribute("error", "验证码出错");
			request.getRequestDispatcher("/login.jsp").forward(request,
					response);
		}
	}

}

package test.servlet;

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 java.util.UUID;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class RandomCodeServlet
 */
public class RandomCodeServlet extends HttpServlet {
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String randomCode = (UUID.randomUUID().toString()).substring(0, 4);
		request.getSession().setAttribute("randomCode", randomCode);

		response.setContentType("image/jpeg"); // 因为向客户端发送的内容是图片. 所以用这种内容类型

		int width = 100;
		int height = 50;
		// 1.创建一个图片对象
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_BGR);

		// 2.得到画布
		Graphics graphics = image.getGraphics();

		// 3.开始在图片上画画

		// 3.1 用白色填充. 首先要设置上下文的颜色
		graphics.setColor(Color.white);// 设置白色
		graphics.fillRect(1, 1, width - 2, height - 2);

		// 3.2 用黑色写文字
		graphics.setColor(Color.black);
		graphics.setFont(new Font("宋体", Font.BOLD, 30));
		graphics.drawString(randomCode, width / 6, height / 2 + 5);

		// 3.3 画混淆内容
		graphics.setColor(Color.red);
		for (int i = 0; i < 50; i++) {
			graphics.fillOval(new Random().nextInt(width),
					new Random().nextInt(height), 3, 3);
		}
		for (int i = 0; i < 10; i++) {
			graphics.setColor(new Color[] { Color.red, Color.blue, Color.GRAY }[new Random()
					.nextInt(3)]);
			graphics.drawLine(new Random().nextInt(width),
					new Random().nextInt(height), new Random().nextInt(width),
					new Random().nextInt(height));
		}

		// 4.关闭画布,释放资源...
		graphics.dispose();
		// 输出图片

		ImageIO.write(image, "JPG", response.getOutputStream());
	}

}

分享到:
评论

相关推荐

    7.OneNET-V3.2-扩展例程_:麒麟座开发板Onenet扩展例程_

    《麒麟座开发板Onenet扩展例程:官方代码解析与实战指南》 在现代物联网(IoT)领域,OneNET平台作为一个强大的云服务平台,为开发者提供了便捷的数据接入、存储、分析以及应用开发的能力。麒麟座开发板作为硬件...

    S7-414H冗余控制例程.zip西门子PLC编程实例程序源码下载

    S7-414H冗余控制例程.zip西门子PLC编程实例程序源码下载S7-414H冗余控制例程.zip西门子PLC编程实例程序源码下载S7-414H冗余控制例程.zip西门子PLC编程实例程序源码下载S7-414H冗余控制例程.zip西门子PLC编程实例程序...

    西门子S7-300PLC应用教程-DP_ET200例程.zip西门子PLC编程实例程序源码下载

    西门子S7-300PLC应用教程-DP_ET200例程.zip西门子PLC编程实例程序源码下载西门子S7-300PLC应用教程-DP_ET200例程.zip西门子PLC编程实例程序源码下载西门子S7-300PLC应用教程-DP_ET200例程.zip西门子PLC编程实例程序...

    App-inventor-mqtt组件例程

    App_inventor_mqtt组件例程,内含mqtt组件,适用于mqtt协议接入阿里云或onenet云平台。 例程为连接阿里云平台,例程连接参数请自行修改,不要连接原参数。 教程链接:...

    中文编程-从入门到精通例程源码

    第一部分 易语言的基础知识 易语言的概述,编程环境与输入法的讲解,易语言数据类型的分类和使用,运算符和表达式的介绍,变量、常量的定义和使用, 资源的添加和使用,子程序的编写与调用。 ...

    DMAVR-128开发板相关例程.rar

    DMAVR-128开发板相关例程.rar DMAVR-128开发板相关例程.rar DMAVR-128开发板相关例程.rar DMAVR-128开发板相关例程.rar DMAVR-128开发板相关例程.rar DMAVR-128开发板相关例程.rar DMAVR-128开发板相关例程.rar ...

    stm32-HC-SR04超声波传感器例程

    STM32-HC-SR04超声波传感器例程是一个基于STM32微控制器的项目,用于实现距离测量功能。HC-SR04传感器是一种常见的超声波测距模块,广泛应用于各种自动化和物联网设备中,如机器人避障、智能家居、安防系统等。这个...

    UBLOX-M8N-GPS模块STM32103例程

    标题“UBLOX-M8N-GPS模块STM32103例程”指的是一个使用UBLOX M8N GPS模块与STM32单片机(可能是STM32F103系列)进行交互的示例程序。这个例程是为了帮助开发者理解如何将UBLOX的高精度GPS接收器与STM32微控制器集成...

    基于S7-200 S7-300 西门子PLC实例例程PLC控制器源码资料合集.zip

    基于S7-200 S7-300 西门子PLC实例例程PLC控制器源码资料合集: s7-200 modbus主、从站例子程序.rar S7-200 modbus主从站标准例程.rar S7-200 Modbus主站通讯程序.rar S7-200 Modbus从站通讯测试.rar S7-200 PID控制...

    STM32-I2C程序例程

    STM32-I2C程序例程是一套专为STM32微控制器设计的I2C通信协议实现,它为开发者提供了清晰易懂的代码参考,旨在简化开发过程并便于移植到其他项目。STM32系列是意法半导体(STMicroelectronics)推出的一种基于ARM ...

    1.OneNET-V3.2-开发板基础学习例程_OneNET平台_onenet开发板官方基础例程_物联网_

    《OneNET-V3.2-开发板基础学习例程》是针对物联网(IoT)领域,特别是基于OneNET平台的开发板应用进行深入学习的一份重要资料。OneNET平台是中移物联网有限公司提供的一款强大的物联网云服务平台,它为开发者提供了...

    GD32F350-Colibri-F350RB开发板相关例程.zip

    GD32F350-Colibri-F350RB开发板相关例程源码,可供学习设计参考。 GD32 Colibri-F350R8是Trochili 为GD32F350定制的入门级开发板。该开发板由底板和扩展版组成,底板包括基本的功能模块,可满足读者初步体验GD32...

    S7-1200_Sample_例程集合

    S7-1200_Sample_例程集合,是对西门子1200与其他西门子产品通讯案例的一个收集文件,下载完成打开,可以直接下载内部的案例,只能用博途V14 SP1以及以上版本打开文件。

    51单片机LCD1602 LCD16864液晶显示模数转换SD卡读写 BMP图片解码等例程(35例)源码.zip

    51单片机LCD1602 LCD16864液晶显示模数转换SD卡读写 BMP图片解码等例程(35例)源码: 例程(1)-LED驱动 例程(10)-内部EEPROM 例程(11)-用PCA扩展外部中断 例程(12)-用PCA实现定时器 例程(13)-用PCA输出高速脉冲 例程...

    易语言验证码识别例程

    易语言验证码识别例程是一种基于易语言编程的示例代码,用于解决自动化处理中的验证码识别问题。验证码(CAPTCHA)通常被用作一种安全机制,防止自动机器人或恶意软件进行非法操作,例如批量注册、垃圾邮件发送等。...

    51单片机例程.zip

    列表:例程(1)-LED驱动 例程(2)-按键输入 例程(3)-流水灯 例程(4)-数码管静态显示 例程(5)-数码管动态显示 例程(6)-矩阵键盘 例程(7)-外部中断 例程(8)-定时器 例程(9)-串口通信 例程(10)-内部EEPROM 例程(11)-用PCA...

    西门子PLC例程源码西门子S7-300PLC应用教程-DP-ET200例程

    西门子PLC例程源码西门子S7-300PLC应用教程-DP_ET200例程本资源系百度网盘分享地址

    西门子S7-300PLC应用教程-zen01_03例程.rar

    西门子S7-300PLC应用教程-zen01_03例程rar,西门子S7-300PLC应用教程-zen01_03例程

Global site tag (gtag.js) - Google Analytics