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>

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

  • 相关阅读:
    MOSS中的User的Title, LoginName, DisplayName, SID之间的关系
    如何在Network Monitor中高亮间隔时间过长的帧?
    SharePoint服务器如果需要安装杀毒软件, 需要注意什么?
    如何查看SQL Profiler? 如何查看SQL死锁?
    什么是Telnet
    The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain.
    Windows SharePoint Service 3.0的某个Web Application无搜索结果
    网络连接不上, 有TCP错误, 如果操作系统是Windows Server 2003, 请尝试一下这里
    在WinDBG中查看内存的命令
    The virtual machine could not be started because the hypervisor is not running
  • 原文地址:https://www.cnblogs.com/shenliang123/p/2417929.html
Copyright © 2011-2022 走看看