• 用画布的方式实现验证码


      1 //用画布做一个验证码
      2 @WebServlet("/image.do")
      3 public class ImageCodeServlet extends HttpServlet {
      4     private static final long serialVersionUID = 1L;
      5     
      6     //设置画布的长宽以及验证码的字的个数
      7     static int width=100;
      8     static int height=40;
      9     static int size=4;
     10     
     11     static Random random=new Random();
     12     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     13 
     14         //1 获取一个人画布
     15         /**
     16          * BufferedImage.TYPE_INT_RGB 画布的三原色
     17          */
     18         BufferedImage bi=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB );
     19     
     20         //2 获取画笔
     21         Graphics graphics=bi.getGraphics();
     22         
     23         //3 给画笔设置一个颜色
     24         graphics.setColor(getColor());
     25     
     26         //4 作画
     27         //4.1 画框 长宽;给画布填充一个背景色
     28         //画一个长方形 坐标从0-0开始
     29         graphics.fillRect(0, 0, width, height);
     30         
     31         //4.2 往框里面写字 写之前设置好的size次
     32         //设置会出现的字体
     33         String str="qwertyuidhjcnx12345689AGDFCZMW";
     34         char[]ch=str.toCharArray();
     35         StringBuilder sb=new StringBuilder();
     36         
     37         for (int i = 0; i < size; i++) {
     38             graphics.setColor(getFontColor());
     39             
     40             //写字的时候,Y坐标的位置:10-40 x坐标从5开始到95结束
     41             
     42             int index=random.nextInt(ch.length);
     43             
     44             graphics.drawString(ch[index]+"", i*15+random.nextInt(10), random.nextInt(25)+15);
     45         
     46             sb.append(ch[index]);
     47         }
     48         
     49         //4.3 添加干扰
     50         //添加点干扰
     51         for (int i = 0; i < 300; i++) {
     52             
     53             graphics.setColor(getColor());
     54             graphics.drawOval(random.nextInt(width), random.nextInt(height), 1, 1);
     55         }
     56         
     57         //添加线干扰
     58         graphics.setColor(getColor());
     59         graphics.clearRect(random.nextInt(width), random.nextInt(height), random.nextInt(50), 1);
     60         
     61         //把验证码的字符存储起来
     62         request.getSession().setAttribute("code",sb.toString());
     63         
     64         //5 将画好的图片,使用流输出到前台
     65         //将bi这个画笔以png的格式输出到前台
     66         ImageIO.write(bi,"png",response.getOutputStream());
     67         
     68     }
     69 
     70     //获取一个颜色对象,背景用浅色,文字用深色
     71     private Color getColor(){
     72         
     73         int x;
     74         int y;
     75         int z;
     76         
     77         do {
     78             x=random.nextInt(250);
     79             y=random.nextInt(250);
     80             z=random.nextInt(250);
     81         } while (!isDark(x, y, y));
     82         
     83         return new Color(x,y,z);
     84     }
     85     
     86     //字体用深色
     87         private Color getFontColor(){
     88             
     89             int x;
     90             int y;
     91             int z;
     92             
     93             do {
     94                 x=random.nextInt(250);
     95                 y=random.nextInt(250);
     96                 z=random.nextInt(250);
     97             } while (isDark(x, y, y));
     98             
     99             return new Color(x,y,z);
    100         }
    101     
    102     
    103     /**
    104      * 根据RGB值判断 深色与浅色
    105      * @param r
    106      * @param g
    107      * @param b
    108      * @return
    109      */
    110     private boolean isDark(int r,int g,int b){
    111         if(r*0.299d + g*0.578d + b*0.114d >= 192){ //浅色
    112             return false;
    113         }else{  //深色
    114             return true;
    115         }
    116     }
    117 
    118     
    119     
    120     
    121     
    122     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    123         // TODO Auto-generated method stub
    124         doGet(request, response);
    125     }

  • 相关阅读:
    bat 命令如何启动远程PC上的一个程序
    Python的内置list类
    Python3的列表推导式
    python3修改Excel中固定单元格的内容
    python3“腌制”数据
    python3用print写数据到文件中
    github在线预览项目(html)
    github简单上手
    事件DOMContentLoaded和load的区别
    jquery 一些事件
  • 原文地址:https://www.cnblogs.com/dabu/p/13033881.html
Copyright © 2020-2023  润新知