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

来源:互联网 发布:手机壁纸网站 知乎 编辑:程序博客网 时间:2024/06/06 10:58
这次的笔记是验证码的生成, 这个生成功能不是我写的,直接复制公司现在有的,不做说明了,里面有很多注释。。。

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;@Controllerpublic 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();;}


原创粉丝点击