广

Java编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    关于java 图形验证码的解决方法

    2018-11-09 09:49:30 次阅读 稿源:互联网
    零七广告

    代码如下:

    package cn.response;

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;

    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    @SuppressWarnings("serial")
    public class validatePicture extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
      try {
       validateimage(request, response);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }

     public void doPost(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
      doGet(request, response);
     }

     public static final int WIDTH = 120;
     public static final int HEIGHT = 25;

     public void validateimage(HttpServletRequest request,
       HttpServletResponse response) throws Exception {

      BufferedImage bi = new BufferedImage(WIDTH, HEIGHT,
        BufferedImage.TYPE_INT_RGB);// 在内存中构建一幅图象
      Graphics g = bi.getGraphics();

      setBackGround(g);// 设置背景色
      setBorder(g);// 设置边框
      drawRandomLine(g);// 画干扰线
      String random = drawRandomNum((Graphics2D) g);// 写随机数

      request.getSession().setAttribute("random", random);
      //request.getSession(false);
      response.setContentType("image/jpeg");
      // 设置不要缓存
      response.setDateHeader("expries", -1);
      response.setHeader("Cache-Control", "no-cache");

      ImageIO.write(bi, "jpg", response.getOutputStream());
     }

     private String drawRandomNum(Graphics2D g) {
      g.setColor(Color.RED);
      g.setFont(new Font("宋体", Font.BOLD, 20));
      // [/u4e00-/u9fa5]中文数字区间
      String base = "/u4e00/u4f00/u5e00/u4e50/u4e89/u4f10/u4e09";

      StringBuffer sb = new StringBuffer();

      int x = 5;
      for (int i = 0; i < 4; i++) {
       int degree = new Random().nextInt() % 30;

       String ch = base.charAt(new Random().nextInt(base.length())) + "";
       sb.append(ch);
       g.rotate(degree * Math.PI / 180, x, 20);
       g.drawString(ch, x, 20);
       g.rotate(-degree * Math.PI / 180, x, 20);

       x = x + 30;
      }
      System.out.println(sb.toString());
      return sb.toString();
     }

     private void drawRandomLine(Graphics g) {
      g.setColor(Color.GREEN);
      for (int i = 0; i < 3; i++) {
       int x1 = new Random().nextInt(WIDTH);
       int y1 = new Random().nextInt(HEIGHT);

       int x2 = new Random().nextInt(WIDTH);
       int y2 = new Random().nextInt(HEIGHT);

       g.drawLine(x1, y1, x2, y2);
      }
     }

     private void setBorder(Graphics g) {
      g.setColor(Color.BLUE);
      g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
     }

     private void setBackGround(Graphics g) {
      g.setColor(Color.WHITE);
      g.fillRect(0, 0, WIDTH, HEIGHT);
     }
    }

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告