zoukankan      html  css  js  c++  java
  • 产生4位包含大小字母与数字的验证码

      1 package sanitation.Util;
    2
    3 import javax.servlet.*;
    4 import javax.servlet.http.*;
    5 import java.io.*;
    6 import java.awt.*;
    7 import java.awt.image.*;
    8 import java.util.*;
    9 import javax.imageio.*;
    10
    11 public class AuthImg extends HttpServlet
    12 {
    13 /**
    14 * 验证码图片的处理
    15 */
    16 private static final long serialVersionUID = 1L;
    17 private Font mFont = new Font("Arial Black", Font.PLAIN, 16); // 根据指定名称、样式和磅值大小,创建一个新 Font
    18 public void init() throws ServletException
    19 {
    20 super.init();
    21 }
    22 //随机产生指定区间颜色
    23 Color getRandColor(int fc,int bc)
    24 {
    25 Random random = new Random();
    26 if(fc>255) fc=255;
    27 if(bc>255) bc=255;
    28 int r=fc+random.nextInt(bc-fc);
    29 int g=fc+random.nextInt(bc-fc);
    30 int b=fc+random.nextInt(bc-fc);
    31 return new Color(r,g,b);
    32 }
    33
    34 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    35 {
    36 response.setHeader("Pragma","No-cache");
    37 response.setHeader("Cache-Control","no-cache");
    38 response.setDateHeader("Expires", 0);
    39 response.setContentType("image/jpeg");
    40 System.out.println("i产生的");
    41 int width=80, height=18;
    42 /**
    43 * 构造一个类型为预定义图像类型之一的 BufferedImage,三个参数分别为:a.所创建图像的宽度
    44 *b.所创建图像的高度 c.所创建图像的类型
    45 * */
    46 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    47 //创建图形上下文
    48 Graphics g = image.getGraphics();
    49 Random random = new Random();
    50 //将此图形上下文的当前颜色设置为指定颜色
    51 g.setColor(getRandColor(200,250));
    52 //填充指定的矩形,fillRect(int x, int y, int width, int height),该矩形左边缘和右边缘分别位于 x 和 x + width - 1。上边缘和下边缘分别位于 y 和 y + height - 1,宽度为width,高度为height
    53 g.fillRect(1, 1, width-1, height-1);
    54 g.setColor(new Color(102,102,102));
    55 //绘制指定矩形的边框。
    56 g.drawRect(0, 0, width-1, height-1);
    57 //将此图形上下文的字体设置为指定字体
    58 g.setFont(mFont);
    59 g.setColor(getRandColor(160,200));
    60 for (int i=0;i<155;i++)
    61 {
    62 int x = random.nextInt(width - 1);
    63 int y = random.nextInt(height - 1);
    64 int xl = random.nextInt(6) + 1;
    65 int yl = random.nextInt(12) + 1;
    66 //drawLine(int x1, int y1, int x2, int y2)在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。
    67 g.drawLine(x,y,x + xl,y + yl);
    68 }
    69 for (int i = 0;i < 70;i++)
    70 {
    71 int x = random.nextInt(width - 1);
    72 int y = random.nextInt(height - 1);
    73 int xl = random.nextInt(12) + 1;
    74 int yl = random.nextInt(6) + 1;
    75 g.drawLine(x,y,x - xl,y - yl);
    76 }
    77 /**
    78 * 以下是产生4位随机数(包括大写字母,小写字母,数字)
    79 * */
    80 String sRand="";
    81 for (int i=0;i<4;i++)
    82 {
    83 //返回一个String的字符
    84 String tmp = getRandomChar();
    85 //下面是为了不让0与o产生歧义,而进行处理
    86 if(tmp.equals("O") || tmp.equals("o")){
    87 tmp="A";
    88 }
    89 if(tmp=="0"){
    90 tmp="B";
    91 }
    92 sRand += tmp;
    93 g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
    94 //使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处
    95 g.drawString(tmp,15*i+10,15);
    96 }
    97 System.out.println("产生的验证码"+sRand.toUpperCase());
    98
    99 HttpSession session = request.getSession(true);
    100 session.setAttribute("rand",sRand);
    101 //释放此图形的上下文以及它使用的所有系统资源
    102 g.dispose();
    103 /**
    104 * 到此图形创建结束,接着借助ImageIO.write(RenderedImage im, String formatName, OutputStream output)将一个图像写入 OutputStream
    105 * */
    106 ImageIO.write(image, "JPEG", response.getOutputStream());
    107 }
    108 /**
    109 * 获取相应的大写字母,小写字母或是数字
    110 * */
    111 private String getRandomChar()
    112 {
    113 //产生小于2的随机数并进行四舍五入
    114 int rand = (int)Math.round(Math.random() * 2);
    115 long itmp = 0;
    116 char ctmp = '\u0000';
    117 switch (rand)
    118 {
    119 case 1:
    120 //产生65-90的Ascii
    121 itmp = Math.round(Math.random() * 25 + 65);
    122 //强制转化为char,获取相应的大写字母
    123 ctmp = (char)itmp;
    124 //下面有了return就可以省略break
    125 return String.valueOf(ctmp);
    126 case 2:
    127 //获取97-122的Ascii,获取小写字母
    128 itmp = Math.round(Math.random() * 25 + 97);
    129 ctmp = (char)itmp;
    130 return String.valueOf(ctmp);
    131 default :
    132 //获取数字
    133 itmp = Math.round(Math.random() * 9);
    134 return String.valueOf(itmp);
    135 }
    136 }
    137 }
    }


    由于项目的需要用户在登录时需要输入验证码进行验证登录,于是就查找相关资料进行验证码的实现,

    以上s就是用servlet实现的4位包含大小写字母和数字的验证码:

    下面就是web.xml配置文件中进行一般servlet的配置

        <servlet>
    <servlet-name>img</servlet-name>
    <servlet-class>sanitation.Util.AuthImg</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>img</servlet-name>
    <url-pattern>/authImg</url-pattern>
    </servlet-mapping>

    这样就完成了,只要在页面中引用该servlet就可以了:示例代码

    <img src="authImg" id="authImg"/><a href="#" onClick="refresh()">看不清,换一张</a>

    哈哈 好久没写博客了,写写还蛮爽的

  • 相关阅读:
    python—内置函数-filter,map,reduce
    python—模块-练习
    python—模块-re正则表达式
    python—模块-logging
    python—模块-subprocess
    python—模块-hashlib加密
    python—模块-configparser
    SpringBoot结合设计模式(观察者模式、策略模式)- 个人记录
    Spring事务-随笔
    Servlet、Tomcat、SpringMVC-整理-随笔
  • 原文地址:https://www.cnblogs.com/shenliang123/p/2417929.html
Copyright © 2011-2022 走看看