生成检验码的两种方式
来源:互联网 发布:消费者网络投诉 编辑:程序博客网 时间:2024/05/19 22:45
一、Servlet + web.xml
1、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 javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * 验证码 * * @author zcq * @version 1.0 * * 变更履历: * v1.0 2017-6-26 zcq 初版 */public class CheckCode extends HttpServlet { private static final long serialVersionUID = 1L; /** * 获取校验码 * * @author zcq * @param req * @param res * @throws IOException * @throws ServletException */ public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { // 设置页面不缓存 res.setContentType("images/jpeg"); res.setHeader("Pragma", "No-cache"); res.setHeader("Cache-Control", "no-cache"); res.setDateHeader("Expires", 0); HttpSession session = req.getSession(true); // 在内存中创建图象 int width = 160; // 在内存中创建图象 int height = 80; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); // 生成随机类 Random random = new Random(); // 设定背景色 -白色 g.setColor(new Color(255, 255, 255)); g.fillRect(0, 0, width, height); // 设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 60)); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(getRandColor(160, 200)); for (int i = 0; i < 4; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(30); int yl = random.nextInt(30); g.drawLine(x, y, x + xl, y + yl); } // 取随机产生的认证码(4位数字) String[] code = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; // 数组长度 int length = code.length; String sRand = ""; for (int i = 0; i < 4; i++) { // String rand=String.valueOf(random.nextInt(10)); //原来方法这个是产生数字的0-9 // sRand+=rand; int start = random.nextInt(length); String rand = code[start]; sRand += rand; // 将认证码显示到图象中 - 红色 g.setColor(new Color(220, 20, 60)); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.drawString(rand, (30 * i) + 15, 60); } // 将认证码存入SESSION session.setAttribute("rand", sRand); // 图象生效 g.dispose(); // 输出图象到页面 ImageIO.write(image, "JPEG", res.getOutputStream()); } private Color getRandColor(int fc, int bc) { // 给定范围获得随机颜色 Random random = new Random(); 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); }}2、web.xml 配置:
<!-- 检验码 --><servlet><servlet-name>CheckCode</servlet-name><servlet-class>com.mnt.preg.web.controller.CheckCode</servlet-class></servlet><servlet-mapping><servlet-name>CheckCode</servlet-name><url-pattern>/CheckCode</url-pattern></servlet-mapping>3、jsp页面:
function changeimg(){var myimg = document.getElementById("randimg"); now = new Date(); myimg.src="page/rand.jsp?code="+now.getTime();}//提交$(document).ready(function(){ changeimg();});<img id="randimg" onclick="changeimg();" width="80" height="45" />二、rand.jsp
<%@page pageEncoding="UTF-8" language="java" contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %><%@ page import="com.mnt.preg.web.constants.SessionConstant"%><%!Color getRandColor(int fc,int bc){//给定范围获得随机颜色 Random random = new Random(); 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); }%><% // 设置页面不缓存 response.setContentType("images/jpeg"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 在内存中创建图象 int width = 105; // 在内存中创建图象 int height = 46; BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics2D g = image.createGraphics(); // 生成随机类 Random random = new Random(); // 设定背景色 -白色 g.setColor(new Color(255,255,255)); g.fillRect(0, 0, width, height); // 设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 38)); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(getRandColor(160, 200)); for (int i = 0; i < 4; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(30); int yl = random.nextInt(30); g.drawLine(x, y, x + xl, y + yl); } // 取随机产生的认证码(4位数字) String[] code = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; // 数组长度 int length = code.length; String sRand = ""; for (int i = 0; i < 4; i++) { // String rand=String.valueOf(random.nextInt(10)); //原来方法这个是产生数字的0-9 // sRand+=rand; int start = random.nextInt(length); String rand = code[start]; sRand += rand; // 将认证码显示到图象中 - 红色 g.setColor(new Color(220,20,60)); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.drawString(rand, (23 * i) + 6, 32); } // 将认证码存入SESSION session.setAttribute(SessionConstant.LOGIN_USER_RAND_CODE, sRand); // 图象生效 g.dispose(); // 输出图象到页面 ImageIO.write(image, "JPEG", response.getOutputStream());//下边两行是防止抛出getOutputStream() has already been called for this response异常的out.clear();out = pageContext.pushBody();%>jsp页面:
function changeimg(){var myimg = document.getElementById("randimg"); now = new Date(); myimg.src="page/rand.jsp?code="+now.getTime();}<img id="randimg" src="page/rand.jsp" onclick="changeimg();" width="80" height="45" />
阅读全文
0 0
- 生成检验码的两种方式
- 验证码的两种生成方式
- 生成图片验证码的两种实现方式
- 生成随机数组的两种方式
- 生成树的两种递归方式
- 生成DTO的两种方式
- javascript生成UUID的两种方式
- Android 生成keystore的两种方式
- java生成随机数的两种方式
- Android 生成keystore的两种方式
- Android生成keystore的两种方式
- 生成签名文件的两种方式
- pb生成excel的两种方式
- 两种方式生成二维码
- JSON数据的生成的两种方式
- 利用"SQL"语句自动生成序号的两种方式
- 利用"SQL"语句自动生成序号的两种方式
- 使用Hibernate生成数据表的两种方式
- android:screenOrientation的说明 固定屏幕显示方向
- Android图片加载框架Glide
- UNIX环境高级编程-读书笔记-系统文件信息
- 54 WebGL实现阴影效果
- mac eclipse 启动时在loading org.eclipse.mylyn.tasks.ui卡住
- 生成检验码的两种方式
- Codeforces Gym 101142 C. CodeCoder vs TopForces
- mysql中创建字段错误
- activiti提示表或视图不存在,无法创建表
- UNIX环境高级编程-读书笔记-进程
- html入门(一)
- 深入理解Spark 2.1 Core (九):迭代计算和Shuffle的原理与源码分析
- 第5章 数据类型和运算符
- 一种新的类型的密码管理软件Lesspass