`

扭曲验证码

    博客分类:
  • java
阅读更多
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.text.AttributedString;
import java.util.Random;

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

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;



public class SimpleCaptcha extends HttpServlet {
private Random generator = new Random();
private final static String SIMPLE_CAPCHA_SESSION_KEY = "SIMPLE_CAPCHA_SESSION_KEY";

private static char[] captchars = new char[] { 'a', 'b', 'c', 'd', 'e',
   '2', '3', '4', '5', '6', '7', '8', 'g', 'f', 'y', 'n', 'm', 'n',
   'p', 'w', 'x' };

/**
  * 产生随机字体
  *
  * @return
  */
private Font getFont() {
  Random random = new Random();
  Font font[] = new Font[5];
  font[0] = new Font("Ravie", Font.PLAIN, 45);
  font[1] = new Font("Antique Olive Compact", Font.PLAIN, 45);
  font[2] = new Font("Forte", Font.PLAIN, 45);
  font[3] = new Font("Wide Latin", Font.PLAIN, 40);
  font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 45);
  return font[random.nextInt(5)];
}

/**
  * 随机产生定义的颜色
  *
  * @return
  */
private Color getRandColor() {
  Random random = new Random();
  Color color[] = new Color[10];
  color[0] = new Color(32, 158, 25);
  color[1] = new Color(218, 42, 19);
  color[2] = new Color(31, 75, 208);
  return color[random.nextInt(3)];
}

/**
  * @see javax.servlet.http.HttpServlet#void
  *      (javax.servlet.http.HttpServletRequest,
  *      javax.servlet.http.HttpServletResponse)
  */
public void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {

  int ImageWidth = 200;
  int ImageHeight = 100;

  int car = captchars.length - 1;
  /**
   * 产生随机字符串
   */
  String test = "";
  for (int i = 0; i < 4; i++) {
   test += captchars[generator.nextInt(car) + 1];
  }
  /**
   * 放放Session
   */
  req.getSession().setAttribute(SimpleCaptcha.SIMPLE_CAPCHA_SESSION_KEY,
    test);
  /**
   * 得到输出流
   */
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(resp
    .getOutputStream());

  BufferedImage bi = new BufferedImage(ImageWidth + 10, ImageHeight,
    BufferedImage.TYPE_BYTE_INDEXED);

  Graphics2D graphics = bi.createGraphics();

  /**
   * 设置背景色
   */
  graphics.setColor(Color.white);
 
  graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight());

  graphics.setColor(Color.black);
  AttributedString attstr = new AttributedString(test);

  TextLayout textTl = new TextLayout(test, new Font("Courier", Font.BOLD,
    70), new FontRenderContext(null, true, false));
  AffineTransform textAt = graphics.getTransform();
  graphics.setFont(new Font("Courier", Font.BOLD,70));
  graphics.setColor(this.getRandColor());
  graphics.drawString(test, 10,70);
//  textTl.draw(graphics, 4, 60);
  int w = bi.getWidth();
  int h = bi.getHeight();
  shear(graphics, w, h, Color.white);
  // this.drawThickLine(graphics, 0, generator.nextInt(ImageHeight) + 1,
  // ImageWidth, generator.nextInt(ImageHeight) + 1, 4, Color.BLACK);

  resp.setContentType("image/jpg");

  encoder.encode(bi);

}

private void shear(Graphics g, int w1, int h1, Color color) {

  shearX(g, w1, h1, color);
  shearY(g, w1, h1, color);
}

public void shearX(Graphics g, int w1, int h1, Color color) {

  int period = generator.nextInt(2);

  boolean borderGap = true;
  int frames = 1;
  int phase = generator.nextInt(2);

  for (int i = 0; i < h1; i++) {
   double d = (double) (period >> 1)
     * Math.sin((double) i / (double) period
       + (6.2831853071795862D * (double) phase)
       / (double) frames);
   g.copyArea(0, i, w1, 1, (int) d, 0);
   if (borderGap) {
    g.setColor(color);
    g.drawLine((int) d, i, 0, i);
    g.drawLine((int) d + w1, i, w1, i);
   }
  }

}

public void shearY(Graphics g, int w1, int h1, Color color) {

  int period = generator.nextInt(40) + 10; // 50;

  boolean borderGap = true;
  int frames = 20;
  int phase = 7;
  for (int i = 0; i < w1; i++) {
   double d = (double) (period >> 1)
     * Math.sin((double) i / (double) period
       + (6.2831853071795862D * (double) phase)
       / (double) frames);
   g.copyArea(i, 0, 1, h1, 0, (int) d);
   if (borderGap) {
    g.setColor(color);
    g.drawLine(i, (int) d, i, 0);
    g.drawLine(i, (int) d + h1, i, h1);
   }

  }

}

private void drawThickLine(Graphics g, int x1, int y1, int x2, int y2,
   int thickness, Color c) {

  // The thick line is in fact a filled polygon
  g.setColor(c);
  int dX = x2 - x1;
  int dY = y2 - y1;
  // line length
  double lineLength = Math.sqrt(dX * dX + dY * dY);

  double scale = (double) (thickness) / (2 * lineLength);

  // The x and y increments from an endpoint needed to create a
  // rectangle...
  double ddx = -scale * (double) dY;
  double ddy = scale * (double) dX;
  ddx += (ddx > 0) ? 0.5 : -0.5;
  ddy += (ddy > 0) ? 0.5 : -0.5;
  int dx = (int) ddx;
  int dy = (int) ddy;

  // Now we can compute the corner points...
  int xPoints[] = new int[4];
  int yPoints[] = new int[4];

  xPoints[0] = x1 + dx;
  yPoints[0] = y1 + dy;
  xPoints[1] = x1 - dx;
  yPoints[1] = y1 - dy;
  xPoints[2] = x2 - dx;
  yPoints[2] = y2 - dy;
  xPoints[3] = x2 + dx;
  yPoints[3] = y2 + dy;

  g.fillPolygon(xPoints, yPoints, 4);
}

} 
分享到:
评论

相关推荐

    C# ASP.NET - 仿Google扭曲验证码

    说明: 用C#实现的“仿Google扭曲验证码”,源文件包括“英文扭曲验证码”和“中文扭曲验证码” ^_^

    彩色 扭曲 验证码

    根据给定的信息,本文将详细解释彩色扭曲验证码的生成原理及其相关实现技术。 ### 彩色扭曲验证码概述 彩色扭曲验证码是一种图形验证码形式,通过在验证码图像中加入颜色、字体变化以及扭曲效果来提高其安全性与防...

    中文扭曲验证码

    在本案例中,我们讨论的是"中文扭曲验证码",这是一种特别设计的验证码,其特点是包含中文字符并且字符经过扭曲处理,以增加机器识别的难度。 验证码的生成过程通常包括以下几个步骤: 1. **字符生成**:首先,...

    扭曲验证码——用户控件

    扭曲验证码是一种常见的安全措施,常用于网页表单中,用于防止自动化的机器人程序或恶意脚本进行非法操作,如批量注册、垃圾邮件发送等。它通过显示一张包含扭曲字母或数字的图片,要求用户输入看到的内容,以此来...

    仿google扭曲验证码

    仿google扭曲验证码 比较实用 实例是asp.net版本的

    ASP.net压缩ViewState,ASP.net操作EXCEL,Word,ASP.net获得验证码,汉字验证码、扭曲验证码

    在这个主题中,我们主要关注五个关键知识点:ASP.NET中ViewState的压缩、操作Excel和Word、以及生成验证码,包括汉字验证码和扭曲验证码。 首先,我们来探讨ASP.NET中的ViewState压缩。ViewState是ASP.NET页面状态...

    Java Web中随机汉字扭曲验证码的实现.pdf

    Java Web中的随机汉字扭曲验证码是一种安全机制,用于防止自动化程序(如机器人)对网站进行恶意操作,如批量注册、重复发帖或发布垃圾信息。验证码的设计理念源于图灵测试,旨在区分计算机和人类用户。其工作原理是...

    仿Google混合扭曲验证码源码 ZHUImitationGoogleCode.rar

    仿Google混合扭曲验证码源码 源码描述: 一、源码特点 一款仿Google绘制成数字、字母和中文扭曲的验证码程序,感兴趣的欢迎下载 二、、注意事项 1、开发环境为Visual Studio 2010,使用.net 4.0开发。

    JAVA识别验证码,支持变形,扭曲,斜线,噪点,支持自己训练

    在JAVA平台上,我们可以利用OCR(Optical Character Recognition,光学字符识别)技术来实现对各种复杂验证码的识别,包括变形、扭曲、斜线干扰以及含有噪点的验证码。本项目的核心就是通过JAVA实现一个强大的OCR...

    python生成扭曲带干扰验证码

    python生成扭曲带干扰验证码,主要用于做训练集,可自行配置字体,干扰线数

    波形扭曲彩色Asp.net验证码

    51aspx无刷新仿google波形扭曲彩色Asp.net验证码

    PHP字符扭曲图片验证码

    "PHP字符扭曲图片验证码"是实现这一功能的一种技术,它利用PHP编程语言生成包含扭曲字符的图片,以此来增加机器识别的难度,同时保持人类用户能够轻松辨认。 PHP验证码的核心在于生成随机字符串,并将其扭曲变形...

    彩色扭曲英文验证码

    "彩色扭曲英文验证码"是其中一种特殊类型,它结合了颜色和扭曲效果,旨在增加机器识别的难度,从而防止自动化程序(如机器人)进行恶意操作。在C#.NET环境下,我们可以利用编程技术来创建这样的验证码。 首先,我们...

    C# 生成随即验证码图片类库

    4. **干扰元素**:为了进一步增加破解难度,通常会在验证码图片上添加一些干扰元素,如随机线条、点、扭曲等。这可以通过`Graphics`类的绘图方法实现。 5. **保存与验证**:生成的验证码图片可以以多种方式保存,如...

    易语言歪体验证码还原

    验证码(CAPTCHA)是一种防止自动程序进行恶意操作的安全机制,它通常由随机生成的扭曲文字或数字组成。而“歪体验证码”则指的是那些形状不规则、倾斜或者变形的字符,增加了机器识别的难度。 验证码还原,特别是...

    php验证码 9款好看的验证码

    2. **图像扭曲验证码** - 为了增强安全性,验证码图像中的文字可能会经过扭曲、旋转或变形处理,使机器识别更困难。 - 使用`imagefilter()`函数可以实现图像扭曲效果,`imagerotate()`用于旋转图像。 3. **数学...

    验证码下载

    描述中提到的“蛮实用的验证码,新仿google波形asp .net验证码”,表明这是一个基于ASP.NET平台开发的验证码系统,它模仿了Google的波形扭曲验证码设计,旨在提高其防机器人攻击的能力。 验证码的主要目的是防止...

    识别验证码

    验证码识别是计算机视觉领域的一个重要应用,主要用于网络安全、防止恶意自动化操作等。Tesseract OCR(Optical Character Recognition,光学字符识别)是一款强大的开源OCR引擎,最初由HP开发,后被Google接手并...

Global site tag (gtag.js) - Google Analytics