java 验证码生成

来源:互联网 发布:中世纪2优化9农业收入 编辑:程序博客网 时间:2024/06/04 19:21
package com.verifycode;import java.awt.Color;import java.util.Random;public class Util {/*//  随机产生5条干扰线,使图象中的认证码不易被其它程序探测到  for(int i=0;i<5;i++){    int x=random.nextInt(width);    int y=random.nextInt(height);    int x1=random.nextInt(width);    int y1=random.nextInt(height);    g.drawLine(x, y, x1, y1);   }*//*  //随机产生100个点,使图中认证码不易被其它程序探测到(线的起点和终点一样就是成一个点了)  for(int i=0;i<100;i++){    int x=random.nextInt(width);    int y=random.nextInt(height);     g.drawLine(x, y, x, y);  }*/ // 背景颜色随机输出的实现public static Color getRandColor(int lower,int upper){   Random random = new Random();   if(upper>255)    upper=255;   if(upper<1)    upper=1;   if(lower<1)    lower=1;   if(lower>255)    lower=255;   int r=lower+random.nextInt(upper-lower);   int g=lower+random.nextInt(upper-lower);   int b=lower+random.nextInt(upper-lower);   return new Color(r,g,b); } }
<pre name="code" class="java">package com.verifycode;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.ServletOutputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;@WebServlet("/VerifyCode")public class VerifyCode extends HttpServlet {private int i = 1; private static final long serialVersionUID = 1L;           public VerifyCode() {        super();    }protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(i++);int width = 150;int height = 60;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();g.setColor(Util.getRandColor(200, 250)); // 背景颜色g.fillRect(0, 0, width, height); // 背景颜色g.setColor(Util.getRandColor(0, 255)); // 边框颜色g.drawRect(0, 0, width-1, height-1); //画边框Random random = new Random();for(int i = 0; i < 5; i++){int x1=random.nextInt(width); int y1=random.nextInt(height); int x2=random.nextInt(width); int y2=random.nextInt(height); g.drawLine(x1, y1, x2, y2); }for(int i=0;i<100;i++){ int x=random.nextInt(width); int y=random.nextInt(height);  g.drawLine(x, y, x, y);} g.setColor(Util.getRandColor(160,200));   Font font = new Font("Small Fonts", Font.ITALIC,38);  // 创建字体,字体的大小应该根据图片的高度来定。// Font font = new Font("Script", Font.ITALIC,38);  // 创建字体,字体的大小应该根据图片的高度来定。// Font font = new Font("Consolas", Font.ITALIC,38);  // 创建字体,字体的大小应该根据图片的高度来定。// Font font = new Font("Times New Roman", Font.ITALIC,38);  // 创建字体,字体的大小应该根据图片的高度来定。  g.setFont(font);//设置字体  int length = 6;  // 设置默认生成6个验证码  String s="赵钱孙李abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // 设置备选验证码:包括"a-z"和数字"0-9"  String sRand=""; // 用随机产生的颜色将验证码绘制到图像中。 // 生成随机颜色(因为是做前景,所以偏深)   //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成  g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); for(int i=0;i<length;i++){ String ch=String .valueOf(s.charAt(random.nextInt(s.length()))); sRand+=ch; g.drawString(ch, 22*i+12, (random.nextInt(5)-2)*i+40); //drawString(a,x,y)a为要画出来的东西,x和y表示要画的东西最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处}  //将生成的字符串存储在session中   HttpSession session=request.getSession();     session.setAttribute("checkCode", sRand);   g.dispose();//图像生效   //禁止图像缓存    response.setHeader("Pragma", "No-cache");   response.setHeader("Cache-Control", "no-cache");   response.setDateHeader("Expires", 0);     response.setContentType("image/jpeg");   //创建二进制的输出流   ServletOutputStream sos=response.getOutputStream();   // 将图像输出到Servlet输出流中。   ImageIO.write(image, "jpeg", sos);   sos.flush();   sos.close();   System.out.println(sRand.toLowerCase()+"----");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}



0 0
原创粉丝点击