`

SpringMVC杂记(十) 验证码生成

阅读更多
以前写过一篇关于这个的博客,现在用SpringMVC了,重写一遍好了。
源代码在GitHub上

package com.github.yingzhuo.mycar.controller;

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 javax.imageio.ImageIO;
import javax.servlet.http.HttpSession;

import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class CaptchaController {

	public static final String CAPTCHA_SESSION_ATTR_NAME = UserController.class
			.getName() + "#CAPTCHA_SESSION_ATTR_NAME";

	private static final HttpHeaders HTTP_HEADERS;
	private static final Random RANDOM;

	static {
		HTTP_HEADERS = new HttpHeaders();
		HTTP_HEADERS.set("Pragma", "No-cache");
		HTTP_HEADERS.set("Cache-Control", "No-cache");
		HTTP_HEADERS.setDate("Expires", 0);
		HTTP_HEADERS.setContentType(MediaType.IMAGE_JPEG);
		RANDOM = new Random();
	}

	private int width;
	private int height;

	@RequestMapping(value = "/images/captcha.jpeg")
	public ResponseEntity<byte[]> captcha(HttpSession session) throws IOException {

		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();
		g.setColor(getRandColor(200, 250));
		g.fillRect(1, 1, width - 1, height - 1);
		g.setColor(new Color(102, 102, 102));
		g.drawRect(0, 0, width - 1, height - 1);
		g.setFont(new Font("Times New Roman", Font.PLAIN, 17));
		g.setColor(getRandColor(160, 200));

		// 画随机线
		for (int i = 0; i < 155; i++) {
			int x = RANDOM.nextInt(width - 1);
			int y = RANDOM.nextInt(height - 1);
			int xl = RANDOM.nextInt(6) + 1;
			int yl = RANDOM.nextInt(12) + 1;
			g.drawLine(x, y, x + xl, y + yl);
		}

		// 从另一方向画随机线
		for (int i = 0; i < 70; i++) {
			int x = RANDOM.nextInt(width - 1);
			int y = RANDOM.nextInt(height - 1);
			int xl = RANDOM.nextInt(12) + 1;
			int yl = RANDOM.nextInt(6) + 1;
			g.drawLine(x, y, x - xl, y - yl);
		}
		
		// 生成随机数,并将随机数字转换为字母
		String captchaStr = "";
		for (int i = 0; i < 6; i++) {
			int itmp = RANDOM.nextInt(26) + 65;
			char ctmp = (char) itmp;
			captchaStr += String.valueOf(ctmp);
			g.setColor(new Color(20 + RANDOM.nextInt(110), 20 + RANDOM.nextInt(110), 20 + RANDOM.nextInt(110)));
			g.drawString(String.valueOf(ctmp), 15 * i + 10, 16);
		}
		g.dispose();
		
		session.setAttribute(CAPTCHA_SESSION_ATTR_NAME, captchaStr);
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ImageIO.write(image, "JPEG", out);

		try {
			return new ResponseEntity<byte[]>(out.toByteArray(), HTTP_HEADERS, HttpStatus.OK);
		} finally {
			IOUtils.closeQuietly(out);
		}
	}

	private Color getRandColor(int fc, int bc) {
		if (fc > 255)
			fc = 255;
		if (bc > 255)
			bc = 255;
		int r = fc + RANDOM.nextInt(bc - fc);
		int g = fc + RANDOM.nextInt(bc - fc);
		int b = fc + RANDOM.nextInt(bc - fc);
		return new Color(r, g, b);
	}

	// access method
	// ----------------------------------------------------------------------------------------------------------------------

	@Value("100")
	public void setWidth(int width) {
		this.width = width;
	}

	@Value("18")
	public void setHeight(int height) {
		this.height = height;
	}
	
}
分享到:
评论

相关推荐

    SpringMVC生成的验证码图片不显示问题及解决方法

    在SpringMVC中,生成验证码图片需要使用@Controller注解的Controller类,通过@RequestMapping注解的方法来处理验证码图片的生成。在本例中,使用ValidateCodeController类来生成验证码图片,并将其输出到客户端。 ...

    SpringMvc三层代码生成器

    SpringMvc三层代码生成器是一种工具,它可以帮助Java开发者快速生成基于SpringMVC框架的三层架构代码,大大提高了开发效率和代码一致性。三层架构通常包括表现层(Presentation Layer)、业务逻辑层(Business Logic...

    j2eeGenerator-1.0_代码生成器_springmvc_springmvc代码生成_feltfjc_

    j2eeGenerator-1.0是针对SpringMVC框架定制的一款代码生成工具,它的核心功能是自动生成与SpringMVC相兼容的Java代码,包括BO、Service、Controller以及对应的JSP页面。这样,开发者可以省去编写这些基础代码的时间...

    springmvc 实体层自动生成工具

    SpringMVC实体层自动生成工具的主要功能包括: 1. 数据库表反向工程:工具能够连接到指定的数据库,读取数据库中的表结构信息,包括字段名、数据类型、主键等,并根据这些信息生成对应的Java实体类。这样,开发者...

    基于SpringMVC annotation 的图形验证码

    基于SpringMVC annotation 的图形验证码 主要是controller的写法 实现前台验证码的显示 和刷新 验证功能相信大家都能写出来 访问 http://localhost:8080/SpringMVC_annotation_volidate/login jsp页面关键代码 ...

    java springmvc实现验证码功能

    验证码的生成可以使用随机数和字体库来实现,例如使用Java的Random类和Font类来生成验证码图片。同时,需要使用springmvc的Controller来处理验证码的生成和验证。 例如,下面是一个简单的后端服务端编写示例: ```...

    SpringMVC4.0 + MyBatis3.2 + 验证码 + 邮箱 + Log4j.rar

    总结来说,"SpringMVC4.0+MyBatis3.2+验证码+邮箱+Log4j.rar"这个项目展示了一个完整的Web应用开发结构,涵盖了前端请求处理、后端业务逻辑、数据访问、安全验证和日志记录等多个关键环节,对于学习和理解这些技术的...

    springmvc+mybatis自动生成

    此框架可自动生成SpringMvc+mybatis框架结构数据库采用的是mysql用户可以自行更改成自己需要的数据库,使用时将本项目导入myeclipse或eclipse中,更改项目名称为 你自定义的项目名称后在Test包中有2个java类...

    java springmvc mapping 逆向生成

    Java SpringMVC Mapping的逆向生成是一个自动化工具的使用过程,主要是为了减少手动编写XML映射文件的工作量,提高开发效率。在这个场景中,我们提到的是使用Mybatis-Generator来生成DAO(数据访问对象)、Model...

    基于Springmvc的上传图片并生成缩略图

    在本文中,我们将深入探讨如何基于Springmvc实现图片上传及生成缩略图的功能。Springmvc是Spring框架的一个重要模块,用于构建MVC模式的Web应用,它提供了强大的数据绑定、模型映射、视图渲染等功能,是Java开发中的...

    SpringMVC杂记(五) JSR303数据验证

    在本篇《SpringMVC杂记(五) JSR303数据验证》中,我们将深入探讨SpringMVC框架如何集成并使用JSR303(JavaBeans Validation)来进行数据验证,这是一种强大的验证机制,可以确保应用程序接收到的数据是合法且符合...

    最新版java代码生成器基于springMvc+mysql 后台功能一键生成

    最新版java代码生成器基于springMvc+mysql 后台功能一键生成 压缩包里的jdk文件目录 请自行下载jdk1.8.0_45版本并覆盖进去 没有jdk是运行不起来的 也可以下载其他jdk版本 但是jdk1.8.0_45这个文件目录名称不要更改 ...

    SpringMVC POI Excel 生成导出

    "SpringMVC POI Excel 生成导出" SpringMVC 是一个基于 Java 的 Web 框架,POI 是一个 Java 库,用于操作 Microsoft Office 文件格式,Excel 是一个电子表格软件。今天,我们将在 SpringMVC 中使用 POI 生成 Excel ...

    springmvc mybatis 自动生成

    此框架可自动生成SpringMvc+mybatis框架结构数据库采用的是mysql用户可以自行更改成自己需要的数据库,使用时将本项目导入myeclipse或eclipse中,更改项目名称为 你自定义的项目名称后在Test包中有2个java类...

    SpringMVC:生成Excel和PDF

    这篇博文“SpringMVC:生成Excel和PDF”主要探讨了如何在SpringMVC应用中创建并导出两种常见文档格式——Excel和PDF。 Excel是Microsoft Office套件中的一个电子表格程序,而PDF(Portable Document Format)则是一...

    springmvc-注册页面发送手机验证码

    用户提交的验证码会被发送到服务器端,后台程序会与预先存储的或生成的验证码进行比对。只有当用户输入的验证码与服务器端的一致时,注册流程才会继续。 6. **实现步骤**: - **前端界面**:`index.jsp`文件可能...

    SpringMvc使用GoogleKaptcha生成验证码

    SpringMvc项目中使用GoogleKaptcha生成验证码是一项常见的安全措施,用于防止自动化程序(如机器人)对网站进行恶意操作。Google Kaptcha是一个强大的验证码生成库,它允许开发者自定义生成的验证码的样式和特性。在...

    验证码的生成与校验

    基于SpringMVC登录模块验证码的生成与校验,详细:http://blog.csdn.net/lazyrabbitlll/article/details/78458603

    springmvc采用freemarker动态生成带图片的word

    在本项目中,我们将探讨如何利用SpringMVC与Freemarker来动态生成带有图片的Word文档。 SpringMVC是Spring框架的一部分,它是一个强大的Model-View-Controller(MVC)架构,用于开发Java Web应用程序。它提供了模型...

Global site tag (gtag.js) - Google Analytics