zoukankan      html  css  js  c++  java
  • java web,生成验证码图片的技术

    偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子

    生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Graphics对象来绘制内容。

    代码如下:

     1 package com.util;
     2 
     3 import java.awt.Color;
     4 import java.awt.Graphics;
     5 import java.awt.image.BufferedImage;
     6 import java.util.Random;
     7 
     8 public class ImageCodeUtil {
     9     
    10     public static BufferedImage getImage(){
    11         Random r = new Random();
    12         //1.创建一个bufferedimage对象
    13         BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);
    14         //2.绘制长方形
    15         Graphics g = image.getGraphics();
    16         g.setColor(new Color(233, 222, 220));
    17         g.fillRect(0, 0, 60, 20);
    18         //3.绘制干扰线
    19         for(int i = 0;i < 200;i++){
    20             g.setColor(new Color(40+r.nextInt(200),40+r.nextInt(200),40+r.nextInt(200)));
    21             int x = r.nextInt(50);
    22             int y = r.nextInt(20);
    23             g.drawLine(x,y, x+r.nextInt(20), y+r.nextInt(15));
    24         }
    25         //4.写四位数字
    26         g.setColor(new Color(23, 22, 20));
    27         int checkCode = r.nextInt(9000)+1000;
    28         g.drawString(checkCode+"", 15, 15);
    29         //关闭Graphics对象,释放资源
    30         g.dispose();
    31         return image;
    32     }
    33     
    34 }

    这是生成图片,在网页显示中,用img标签就可以,通过servlet请求图片资源,代码如下:

    1 <img alt="" src="check">

    最后在servlet代码中响应浏览器发来的请求,将图片资源发送到浏览器,代码如下:

    package com.controller;
    
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.util.ImageCodeUtil;
    
    /**
     * Servlet implementation class CheckCodeServlet
     */
    @WebServlet("/check")
    public class CheckCodeServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public CheckCodeServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            //设置返回类型
            response.setContentType("image/jpeg");
            //生成验证码图片用到了java.awt包
            BufferedImage image = ImageCodeUtil.getImage();
            //将image通过outputStream返回
            ImageIO.write(image, "JPEG", response.getOutputStream());
        }
    
        
        
    }

    以上只是每一次刷新页面请求服务的时候验证码才会刷新,可以加入js代码注册点击事件,使之可以点击验证码图片就可以更换,代码如下:

    注:此处我使用的jq

    $("img").click(function(){
                $(this).attr("src","/ServletTest/check?a="+new Date().getMilliseconds());    
            });

    至此,验证码的效果已经实现。具体在页面上的美观显示,在网页上通过css重新修饰一下。

  • 相关阅读:
    南京网络赛a(离线 树状数组)
    super_log(欧拉降幂)
    ac自动机模板 hdu2222
    Seek the Name, Seek the Fame POJ
    Power Strings(求循环次数最多的循环节 kmp)
    Period(循环节 nxt数组的应用)
    kmp 算法回顾(Number Sequence HDU
    最短路 2 (百度之星 初赛3 B)(floyd)
    path(优先队列,dijk拓展)
    (银联复赛)爱喝「肥宅快乐水」的班长
  • 原文地址:https://www.cnblogs.com/daimazhang/p/5373537.html
Copyright © 2011-2022 走看看