java鬼混笔记:页面验证码生成

这次的笔记是验证码的生成, 这个生成功能不是我写的,直接复制公司现在有的,不做说明了,里面有很多注释。。。

ICodeC.java

package com.c;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.Random;

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

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

@Controller
public class ICodeC{

	/** 定义验证码图片的宽度 */
	private static final int IMG_WIDTH = 68;
	/** 定义验证码图片的高度 */
	private static final int IMG_HEIGHT = 41;
	/** 定义一个Random对象 */
	private static Random random = new Random();
	/** 定义字体对象 */
	private static Font font = new Font("宋体", Font.BOLD, 20);

	@RequestMapping("iCode")
	public void execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

		/** 设置响应的内容类型 */
		response.setContentType("images/jpeg");
		response.setHeader("Cache-Control", "no-cache");
		/** 创建一个图片缓冲流对象 */
		BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT,
				BufferedImage.TYPE_INT_RGB);
		/** 获取到画笔 */
		Graphics g = image.getGraphics();
		/** 填充一个矩形框 */
		g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
		/** 设置画笔的颜色 */
		g.setColor(Color.BLACK);
		/** 绘制一个矩形框 */
		g.drawRect(0, 0, IMG_WIDTH - 1, IMG_HEIGHT - 1);
		/** 绘制干扰线 */
		for (int i = 0; i < 50; i++) {
			/** 设置画笔的颜色(颜色是随机生成) */
			g.setColor(new Color(180 + random.nextInt(75), 180 + random
					.nextInt(75), 180 + random.nextInt(75)));
			// 第一点
			int x1 = 2 + random.nextInt(IMG_WIDTH - 4);
			int y1 = 2 + random.nextInt(IMG_HEIGHT - 4);
			// 第二点
			int x2 = 2 + random.nextInt(IMG_WIDTH - 4);
			int y2 = 2 + random.nextInt(IMG_HEIGHT - 4);
			g.drawLine(x1, y1, x2, y2);
		}

		/** 绘制验证码(随机生成四个验证码) */
		g.setFont(font); // 设置字体
		String code = ""; // 保存最终生成的验证码
		for (int i = 0; i < 4; i++) {
			String temp = generatorVerify();
			code += temp;
			/** 设置画笔的颜色(颜色是随机生成) */
			g.setColor(new Color(random.nextInt(20), random.nextInt(40), random.nextInt(20)));

			int offsetLeft = transferFrom(g);

			g.drawString(temp, 13 * i + offsetLeft, 20);
		}
		request.getSession().setAttribute("iCode", code);
		/** 消毁画笔 */
		g.dispose();
		/** 输出 */
		ImageIO.write(image, "jpeg", response.getOutputStream());
	}

	/**
	 * 画笔位置倾斜方法
	 * 
	 * @param g
	 * @return
	 */
	private int transferFrom(Graphics g) {
		Graphics2D gr = (Graphics2D) g;
		AffineTransform tr = gr.getTransform();
		// 随机生成倾斜率
		double shx = Math.random();
		// 保证倾斜率在(0.25-0.55)之间
		if (shx < 0.25)
			shx = 0.25;
		if (shx > 0.55)
			shx = 0.55;
		// 随机向右是左倾斜
		int temp = random.nextInt(2);
		int offsetLeft = 2;
		if (temp == 0) {
			shx = 0 - shx;
			offsetLeft = 10;
		}
		tr.setToShear(shx, 0);
		gr.setTransform(tr);
		return offsetLeft;
	}

	/**
	 * 随机生成一个验证码(大写字母、小写字母、数字、汉字)
	 * 
	 * @return
	 */
	private String generatorVerify() {
		/** 随机生成0-3之间的数字 */
	//	int witch = (int) Math.round((Math.random() * 2));
		int witch = 2;
		switch (witch) {
		case 0: // 生成大写字母(A-Z|65-90)
			long temp = Math.round(Math.random() * 25 + 65);
			return String.valueOf((char) temp);
		case 1: // 生成小写字母(a-z|97-122)
			temp = Math.round(Math.random() * 25 + 97);
			return String.valueOf((char) temp);
		case 2: // 生成数字(0-9)
			return String.valueOf(Math.round(Math.random() * 9));
		default: // 生成汉字(0x4E00-0x9FBF)
			temp = Math.round(Math.random() * 500 + 0x4E00);
			return String.valueOf((char) temp);
		}
	}

	public void setRandom(String random) {};
	
}

页面上怎么调用 ,如下面的代码:

<img src="${basePath}/iCode.do" id="id_iCode"/> <a id="kanbuq" href="javascript:changeIcode()">看不清,换一张</a> </div>

function changeIcode(){
	// 注意后面的time是随便给的,你也可以写成a或者b,值是个时间或随机数就行,这样子的目的是因为你发个请求时,浏览器发现url相同了的话,直接用缓存里的图片,导致验证码不会改变,所以加个参数让url不同,不同就重新请求新的验证码
	document.getElementById("id_iCode").src = "${basePath}/iCode.do?time=" + new Date().getTime();;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值