zoukankan      html  css  js  c++  java
  • java 实现验证码

      1 package edu.zzuli.common;
      2 
      3 import java.awt.Color;
      4 import java.awt.Font;
      5 import java.awt.Graphics2D;
      6 import java.awt.image.BufferedImage;
      7 import java.io.IOException;
      8 import java.util.Random;
      9 
     10 import javax.imageio.ImageIO;
     11 import javax.servlet.ServletException;
     12 import javax.servlet.http.HttpServlet;
     13 import javax.servlet.http.HttpServletRequest;
     14 import javax.servlet.http.HttpServletResponse;
     15 
     16 
     17 /**
     18  * @author tianshaojie
     19  * @date 2011-1-7
     20  * @discription :
     21  */
     22 public class VerifyCodeServlet extends HttpServlet {
     23         
     24         private static final long serialVersionUID = -7713673953332628094L;
     25 
     26         private Font mFont = new Font("Arial Black", Font.BOLD, 15); // 设置字体new  Font("Arial Black",  Font.PLAIN, 15);
     27 
     28         private int lineWidth = 5; // 2// 干扰线的长度=1.414*lineWidth
     29 
     30         private int width = 60; // 定义图形大小
     31 
     32         private int height = 20; // 定义图形大小
     33 
     34         private int count = 300;// 200
     35 
     36         private Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色
     37                 Random random = new Random();
     38                 if (fc > 255) {
     39                         fc = 255;
     40                 }
     41                 if (bc > 255) {
     42                         bc = 255;
     43                 }
     44                 int r = fc + random.nextInt(bc - fc);
     45 
     46                 int g = fc + random.nextInt(bc - fc);
     47                 int b = fc + random.nextInt(bc - fc);
     48                 return new Color(r, g, b);
     49         }
     50 
     51         @SuppressWarnings("unused")
     52         private char random2Char(int random) {
     53                 char c = '0';
     54                 if (random >= 0 && random <= 9) {
     55                         c = (char) (random + 48);
     56                 } else if (random >= 10 && random <= 35) {
     57                         c = (char) (random + 55);
     58                 } else if (random >= 36 && random <= 61) {
     59                         c = (char) (random + 61);
     60                 }
     61                 return c;
     62         }
     63 
     64         public void doPost(HttpServletRequest request, HttpServletResponse response)
     65                         throws ServletException, IOException {
     66                 doGet(request, response);
     67         }
     68 
     69         public void doGet(HttpServletRequest request, HttpServletResponse response)
     70                         throws ServletException, IOException {
     71                 // response.reset();
     72                 // 设置页面不缓存
     73                 response.setHeader("Pragma", "No-cache");
     74                 response.setHeader("Cache-Control", "no-cache");
     75                 response.setDateHeader("Expires", 0);
     76                 response.setContentType("image/gif");
     77                 // 在内存中创建图象
     78                 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     79 
     80                 // 获取图形上下文
     81                 Graphics2D g = (Graphics2D) image.getGraphics();
     82                 // 生成随机类
     83                 Random random = new Random();
     84                 // 设定背景色
     85                 g.setColor(getRandColor(200, 250)); // ---1
     86                 g.fillRect(0, 0, width, height);
     87 
     88                 // 设定字体
     89                 g.setFont(mFont);
     90 
     91                 // 画边框
     92                 g.setColor(getRandColor(0, 20)); // ---2
     93                 g.drawRect(0, 0, width - 1, height - 1);
     94 
     95                 // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
     96                 for (int i = 0; i < count; i++) {
     97                         g.setColor(getRandColor(150, 200)); // ---3
     98                         int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内
     99                         int y = random.nextInt(height - lineWidth - 1) + 1;
    100                         int xl = random.nextInt(lineWidth);
    101                         int yl = random.nextInt(lineWidth);
    102                         g.drawLine(x, y, x + xl, y + yl);
    103                 }
    104 
    105                 // 取随机产生的认证码(4位数字)
    106                 String sRand = "";
    107 
    108                 for (int i = 0; i < 4; i++) {
    109                         // String rand = String.valueOf(random2Char(random.nextInt(62)));
    110                         String rand = String.valueOf(random.nextInt(10));
    111                         sRand += rand;
    112                         // 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
    113                         g.setColor(new Color(20 + random.nextInt(130), 20 + random.nextInt(130), 20 + random.nextInt(130))); // --4--50-100
    114                         g.drawString(rand, (13 * i) + 6, 16);
    115                 }
    116                 // 将认证码存入SESSION
    117                 request.getSession().setAttribute(Constants_core.RANDOM_CHECKCODE, sRand);
    118                 // System.out.println("checkcode:"+sRand);
    119                 // 图象生效
    120                 g.dispose();
    121                 // 输出图象到页面
    122                 ImageIO.write(image, "PNG", response.getOutputStream());
    123         }
    124 
    125         public static String randomCheckCode(HttpServletRequest request) {
    126                 Random random = new Random();
    127                 String sRand = "";
    128                 for (int i = 0; i < 4; i++) {
    129                         String rand = String.valueOf(random.nextInt(10));
    130                         sRand += rand;
    131                 }
    132                 request.getSession().setAttribute(Constants_core.RANDOM_CHECKCODE, sRand);
    133                 return sRand;
    134         }
    135 
    136 }
  • 相关阅读:
    Spring Security11、登录用户管理
    Spring Security10、账号登录并发控制
    win10下怎么打开notepad++多个实例
    gnu make
    es学习记录
    upj
    JConsole连接远程Java进程
    常用的几种成本核算方法
    SQL SERVER 统计字符串中某字符出现的次数
    centos误删除系统自带的python解决方法
  • 原文地址:https://www.cnblogs.com/XiaoGer/p/3605670.html
Copyright © 2011-2022 走看看