`
baobeituping
  • 浏览: 1068422 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java(Servlet) 产生扭曲的随机验证码

阅读更多

1.写一个SERVLET

package com.servlet;

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);
 }

}
2.配置这个servlet

然后在你要用验证码的页面用图片的方式进行访问

body topmargin="0" leftmargin="0" bgcolor="#FFFFCC">
 <input type="button" value="click" onclick="check()">
 
 <img src="/WifeQianDao/login">

//WifeQianDao是工程名,/login为servlet的名字
</body>

分享到:
评论

相关推荐

    java用servlet实现登陆验证码

    Java使用Servlet实现登录验证码涉及到的是Web开发中的安全性与用户体验部分。验证码是一种常用的安全机制,用于防止自动化的机器人或恶意程序进行非法操作,如批量注册、恶意登录等。在这个例子中,我们将探讨两种...

    java web笔记之servlet生成验证码

    3. 生成随机验证码:使用`java.util.Random`和`java.lang.Math`类生成一组随机数字或字母,组合成验证码字符串。 4. 保存验证码:将生成的验证码保存在会话(Session)中,以便在验证时进行比较。使用`...

    jsp,servlet,验证码,验证码点击更换

    在验证码系统中,Servlet可以生成随机验证码字符串,存储到服务器端,同时创建对应的图像文件供JSP展示。 验证码通常由一组随机字符组成,这些字符可能包括字母、数字、特殊符号等。在生成验证码时,我们可以通过...

    Servlet生成图片验证码

    4. **扭曲和变形**:为了增加验证码的可读性难度,我们可以扭曲和变形图像,例如旋转、缩放或倾斜文字。 5. **保存图像到响应流**:绘制完成后,Servlet将图像数据写入HTTP响应的输出流中,设置适当的MIME类型(如`...

    登陆验证+servlet动态生成图片验证码

    在Servlet中生成图片验证码,首先需要创建一个Servlet类,该类将负责生成随机字符串并将其转化为图像。以下是一些关键步骤: 1. **生成随机字符串**:使用`java.util.Random`和`char[]`数组来创建一个指定长度的...

    servlet实现的图片验证码

    本教程将详细介绍如何使用Servlet技术来实现一个基本的图片验证码功能。Servlet是Java服务器端编程的核心技术之一,它可以接收和响应HTTP请求,非常适合构建动态Web应用程序。 首先,我们需要理解验证码的基本原理...

    servlet实现的验证码

    在本项目中,我们将探讨如何使用Java的Servlet和JSP技术来实现一个基本的验证码功能。 首先,验证码的核心是生成一段随机的、难以被机器识别的字符串。在Servlet中,我们可以创建一个方法生成这样的字符串,通常...

    JSP 随机验证码

    本话题将深入探讨如何使用Java Server Pages (JSP)来生成数字形式的随机验证码,并实现图片化显示及刷新功能。 首先,我们需要理解JSP的基本原理。JSP是一种动态网页技术,它允许开发人员在HTML页面中嵌入Java代码...

    利用servlet动态生成验证码

    在Web开发中,Servlet是一种Java技术,用于生成动态网页内容。本教程主要讲解如何利用Servlet来实现动态生成验证码的功能,这对于防止机器人或恶意自动化程序在网站上进行非法操作至关重要。验证码通常由一串随机...

    使用Servlet生成图片验证码

    在"使用Servlet生成图片验证码"这个主题中,我们首先会创建一个Servlet来生成随机的字母和数字组合,通常包含4到6位。这可以通过Java的Random类和Character类来实现。验证码生成后,将其保存在服务器的内存中,以便...

    随机验证码(可刷新)

    本项目名为“随机验证码(可刷新)”,它使用Java编程语言结合Servlet技术来实现一个动态生成并可刷新的验证码功能。这个功能尤其适用于Web应用,确保每次用户请求时都能得到一个新的、独一无二的验证码。 首先,...

    JAVA实现网站验证码功能demo(servlet)

    在这个验证码实现中,Servlet将负责生成随机验证码图片以及验证用户输入的验证码是否正确。 1. **验证码生成**: - 首先,创建一个Servlet类,如`VerificationCodeServlet`,继承`HttpServlet`。 - 在`doGet`方法...

    Servlet仿CSDN动态验证码的生成-带数字和字母

    在生成动态验证码的场景下,Servlet负责接收客户端请求,生成随机验证码,并将其存储在服务器端,同时将验证码的图像返回给客户端显示。 验证码的生成通常包含以下几个步骤: 1. **随机数生成**:首先,我们需要...

    java servlet验证码和一个javascript菜单联动例子

    在这个特定的例子中,我们关注的是如何利用Java Servlet生成验证码以及如何将验证码与JavaScript实现的菜单进行联动。 首先,Java Servlet是Java平台上的一个标准组件,它允许开发者创建动态web应用程序。在验证码...

    java验证码/servlet

    - 验证码的生成通常包括选择随机字体、颜色、背景、扭曲、噪声等元素,以增加机器识别的难度。 - 文字或数字的组合可以动态生成,确保每次请求都不同。 - 使用`Graphics2D` API可以在Java中绘制验证码图像。 5. ...

    基于servlet实现简单验证码验证

    在验证码场景下,Servlet主要负责处理HTTP请求,生成随机验证码,并将其存储在服务器端,同时将验证码的图像发送给客户端显示。 1. **验证码生成**:验证码通常由一组随机的字母和数字组成,具有一定的长度和复杂度...

    生成验证码(带详细注释、Servlet已获取生成的验证码和输入的验证码)

    - **干扰元素**:为了增加破解难度,验证码图像中通常会添加噪声、扭曲线条、背景色等干扰元素。这些可以通过在画布上随机绘制线条、圆点实现。 2. **Servlet处理**: - **HTTP请求**:当用户点击生成验证码时,...

    js+Servlet实现验证码

    在Web开发中,JavaScript和Servlet是两种常用的编程语言,它们可以结合使用来创建一个有效的验证码系统。 首先,JavaScript通常在客户端运行,它可以生成随机的图形验证码并在网页上显示。这个过程涉及以下几个步骤...

    JSP随机验证码实例源码

    在这个JSP随机验证码实例中,我们将深入探讨其工作原理、实现方法以及源码解析。 验证码的核心是生成一组随机的、难以被程序识别的字符或数字组合。在JSP(JavaServer Pages)环境中,我们可以利用Java的强大功能来...

    Servlet生成动态验证码

    为了使验证码更难以被机器识别,可以扭曲字体、添加噪声或者模糊效果。 5. 随机数生成: `java.util.Random`类是生成随机数的基础,可以用于生成整数、浮点数等。在验证码生成中,我们需要生成一系列不重复的字符...

Global site tag (gtag.js) - Google Analytics