Java Web验证码

1 验证码生成类RandomCode

RandomCode是一个生成验证码的工具类,支持英文和数字验证码,验证码包括英文大小写和数组,其中英文i、o和数字0、1因为容易产生混淆,不包括在生成验证码中。RandomCode支持输出jpg/bmp/png/gif图片格式的验证码。

/**
 * RandomCode验证码可以通过静态方法和实例方法生成。
 *
 * 静态方法:
 *
 * //生成长度为4的随机验证码
 * String code = RandomCode.randomString(4);
 *
 * //把验证码图片输入到response输出流中
 * //图片格式jpg
 * OutputStream os = response.getOutputStream();
 * RandomCode.write(code, 120, 30, os, "jpg");
 *
 * 实例方法:
 *
 * //实例化验证码类
 * RandomCode rc = new RandomCode(4);
 *
 * //把验证码图片输入到response输出流中
 * //图片格式jpg
 * OutputStream os = response.getOutputStream();
 * rc.write(120, 30, os, "jpg");
 *
 * //获取验证码字符串
 * String code = rc.getCode();
 *
 */
public class RandomCode {
	/**
	 * 随机验证码字符
	 */
	private static String base = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";

	/**
	 * 随机验证码长度
	 */
	private int length = 4;

	/**
	 * 验证码字符串
	 */
	private String code;

	/**
	 * 4位随机验证码
	 */
	public RandomCode(){
		this.code = RandomCode.randomString(this.length);
	}

	public RandomCode(int length){
		if(length > 0){
			this.length = length;
		}

		this.code = RandomCode.randomString(this.length);
	}

	/**
	 * 生成验证码图片
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @return
	 */
	public BufferedImage toImage(int width, int height){
		return RandomCode.toImage(this.code, width, height);
	}

	/**
	 * 输出验证码图片,默认图片格式jpeg
	 * @param width
	 * @param height
	 * @param os
	 * @throws IOException
	 */
	public void write(int width, int height, OutputStream os) throws IOException{
		RandomCode.write(code, width, height, os, "jpeg");
	}

	/**
	 * 输出验证码图片
	 * @param width
	 * @param height
	 * @param os
	 * @param format 图片格式,支持jpg/jpeg/bmp/gif/png
	 * @throws IOException
	 */
	public void write(int width, int height, OutputStream os, String format) throws IOException{
		RandomCode.write(code, width, height, os, format);
	}

	public int getLength() {
		return length;
	}

	public String getCode() {
		return code;
	}

	/**
	 * 静态方法
	 * 生成随机字符串
	 * @param length 字符串长度
	 * @return 随机字符串
	 */
	public static String randomString(int length){
		Random random = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i = 0; i < length; i++){
			sb.append(base.charAt(random.nextInt(base.length())));
		}
		return sb.toString();
	}

	/**
	 * 静态方法
	 * 输出验证码图片
	 * @param code 验证码字符串
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @param os 图片输出流
	 * @param format 图片格式,支持jpg/jpeg/bmp/gif/png
	 * @throws IOException
	 */
	public static void write(String code, int width, int height, OutputStream os, String format) throws IOException{
		BufferedImage image = toImage(code, width, height);
		ImageIO.write(image, format, os);
	}

	/**
	 * 静态方法
	 * 输出验证码图片,默认图片格式jpeg
	 * @param code 验证码字符串
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @param os 图片输出流
	 * @throws IOException
	 */
	public static void write(String code, int width, int height, OutputStream os) throws IOException{
		write(code, width, height, os, "jpeg");
	}

	/**
	 * 静态方法
	 * 字符串转成验证码图片
	 * @param code 验证码字符串
	 * @param width 验证码图片宽度,单位像素
	 * @param height 验证码图片高度,单位像素
	 * @return
	 */
	public static BufferedImage toImage(String code, int width, int height){
		//字体大小
		int fontSize = (int)Math.ceil(height * 0.9);
		if(fontSize < 20){
			fontSize = 20;
		}

		//字体在Y坐标上的位置
		int positionY = (int)Math.ceil(height * 0.8);

		int lenCode = code.length();

		//计算字体宽度
		int fontWidth = width / (lenCode + 2);

		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
		Graphics g = image.getGraphics();

		//图片背景随机颜色
		g.setColor(randomColor(new Random(), 200, 250));
		g.fillRect(0, 0, width, height);

		//设置字体
		g.setFont(new Font("Times New Roman", Font.BOLD, fontSize));

		//在图片上画纵横交错的线,达到混淆效果
		drawLines(g, width, height);

		//在图片上画验证码
		drawString(g, code, fontWidth, positionY);

		g.dispose();

		return image;
	}

	/**
	 * 静态方法
	 * 在图片上话位子
	 * @param g
	 * @param code 验证码字符串
	 * @param fontWidth 字体宽度
	 * @param positionY 字体Y坐标
	 */
	private static void drawString(Graphics g, String code, int fontWidth, int positionY){
		int len = code.length();
		Random random = new Random();
		for(int i = 0; i < len; i++){
			g.setColor(randomColor(random));
			g.drawString(String.valueOf(code.charAt(i)), (i + 1) * fontWidth, positionY);
		}
	}

	private static Color randomColor(Random random){
        int r = random.nextInt(255);
        int g = random.nextInt(255);
        int b = random.nextInt(255);
        return new Color(r, g, b);
    }

	private static Color randomColor(Random random, int fc, int bc){
        if(fc > 255){
        	fc = 255;
        }

        if(bc > 255){
        	bc = 255;
        }   

        int diff = bc-fc;
        int r = fc + random.nextInt(diff);
        int g = fc + random.nextInt(diff);
        int b = fc + random.nextInt(diff);
        return new Color(r,g,b);
    }

	/**
	 * 静态方法
	 * 画纵横交错的线
	 * @param g
	 * @param width 验证码图片宽度
	 * @param height 验证码图片高度
	 */
	private static void drawLines(Graphics g, int width, int height){
		Random random = new Random();

		//线的数量
		int count = ((int)(Math.ceil(random.nextDouble() * 100))) + 100;		

		for(int i = 0; i < count; i++){
			int fc = 160 + (int)Math.ceil(random.nextDouble() * 40);
			int bc = 200 + (int)Math.ceil(random.nextDouble() * 55);
	        g.setColor(randomColor(random, fc, bc));

			int x = random.nextInt(width);
	        int y = random.nextInt(height);
	        int xl = random.nextInt(width / 5);
	        int yl = random.nextInt(height / 5);
	        g.drawLine(x, y, x + xl, y + yl);
		}
    }
}

2 Servlet返回验证码

请求路径http://<网站路径>/random/code/servlet

@WebServlet("/random/code/servlet")
public class RandomCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 验证码图片宽度,单位像素
		int width = 120;
		// 验证码图片高度,单位像素
		int height = 30;
		// 验证码图片格式
		String format = "png";
		// 验证码字符长度
		int len = 4;

		// 设置图片格式
		response.setContentType("image/" + format);

		// 禁止浏览器缓存图片
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);

		String code = RandomCode.randomString(len);

		// 把图片输出到response输出流
		RandomCode.write(code, width, height, response.getOutputStream(), format);
	}
}

3 Strust2返回验证码

public class RandomCodeAction extends ActionSupport {
	private static final long serialVersionUID = -7515645222798283236L;

	/**
	 * 获取验证码
	 */
	public void generateCode() {
		HttpServletResponse response = ServletActionContext.getResponse();

		// 验证码图片宽度,单位像素
		int width = 120;
		// 验证码图片高度,单位像素
		int height = 30;
		// 验证码图片格式
		String format = "png";
		// 验证码字符长度
		int len = 4;

		// 设置图片格式
		response.setContentType("image/" + format);

		// 禁止浏览器缓存图片
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);

		String code = RandomCode.randomString(len);

		// 把图片输出到response输出流
		try {
			RandomCode.write(code, width, height, response.getOutputStream(), format);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Struts2的验证码配置

<package name="pkg-random-code" namespace="/" extends="struts-default">
	<action name="randomCode_*" method="{1}" class="com.rhui.web.action.RandomCodeAction"></action>
</package>

请求路径http://<网站路径>/randomCode_generateCode.do

4 SpringMVC返回验证码

请求路径http://<网站路径>/random/code/generate.do

package com.rhui.web.controller;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.rhui.util.RandomCode;

@Controller
@RequestMapping("/random/code")
public class RandomCodeController {
	@RequestMapping("/generate.do")
	public void generateCode(HttpServletResponse response) {
		// 验证码图片宽度,单位像素
		int width = 120;
		// 验证码图片高度,单位像素
		int height = 30;
		// 验证码图片格式
		String format = "png";
		// 验证码字符长度
		int len = 4;

		// 设置图片格式
		response.setContentType("image/" + format);

		// 禁止浏览器缓存图片
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);

		String code = RandomCode.randomString(len);

		// 把图片输出到response输出流
		try {
			RandomCode.write(code, width, height, response.getOutputStream(), format);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 08:24:06

Java Web验证码的相关文章

java web验证码生成总结(包括servlet、jsp和struts2实现)(转)

一.使用纯Servlet实现验证码 (1)在web.xml配置: [java] view plaincopy <servlet> <servlet-name>image</servlet-name> <servlet-class>org.test.web.AuthImage</servlet-class> </servlet> <servlet-mapping> <servlet-name>image</

java web 验证码生成

先看看效果图: 一般需求应该够用了,有线条干扰线,斑点,字体小幅度的旋转.. 还没有与session挂钩上,所以只能用于简单的测试用例. 直接上代码,看代码注释... 1 package com.act262.demo; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.Graphics2D; 7 import java.awt.image.Buffer

Java Web:使用Servlet生成网页随机图片验证码

最近在学习Java Web开发,做了一个生成网页随机图片验证码的例子,在此记录. 一.新建Servlet项目: 在MyEclipse中新建Servlet项目,一步步操作就OK,在此不再赘述.建好之后文件目录树如下图: 二.源代码实现: (1)java代码: package com.zdt.identity; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.

JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

[我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意破解密码.刷票.论坛灌水.有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录. 原理 在servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在

java登录验证码

一.创建web项目 使用简单servlet来演示java验证码图片生成,servlet简单使用参考http://www.cnblogs.com/ywlaker/p/6038676.html 二.生成验证码 创建VcodeObject.java,存储验证码与图片 package com.demo.vcode; import java.io.InputStream; public class VcodeObject { private String code; private InputStream

solve the problem of &#39;java web project cannot display verification code&#39;

my java code of the function: package com.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.servlet.ServletException;

工作笔记5.JAVA图片验证码

本文主要内容为:利用JAVA图片制作验证码. 设计思路: 1.拷贝AuthImageServlet.class图片验证码 2.配置web.xml 3.JSP中,调用封装好的AuthImageServlet,实现载入验证码的功能. 4.取出存放在Session中的验证码.在Action中推断验证码的正确性 相比較上一篇博客<工作笔记5.JAVA文本框验证码>而言,图片验证码添加了安全性. 在Action中,通过取出Session中的验证码与输入的验证码是否匹配进行推断. 步骤: 1.拷贝Auth

Java Web入门项目之“网络交友”的设计与实现

前言:这个小项目是我刚学习JSP时,参考"JSP程序设计"这本书写的.这里之所以说参考这本书而不是照着这本书写,主要是因为我自己完成的时候删掉了不少繁琐的写法(比如:文件上传):同时对书中容易产生SQL注入漏洞,XSS跨站脚本漏洞等地方的写法进行了修改过滤:登录页面加上了随机验证码.除此之外,还添加了文件管理功能 PS:整个项目没有特别的难点,可以分为一个个功能点实现,大神轻喷,个人认为对初学Java Web的童鞋还是有参考意义的 注:整个项目的完整源代码和sql文件我会在文末给出下载

java登陆验证码与JS无刷新验证

最近公司的项目的登陆模块由我负责,所以就做了个登陆小功能进行练手,其包括了用jQuery对用户名和密码进行不为null验证,和出于安全性考虑加了一个验证码的校验 别的不说先上代码 controller层 CreateImage.java package com.controller; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage;