有时候在我们的网络应用中,防止程序自动登录搞破坏,我们一般都会加上验证码,这些验证码一般来说都是由人来识别的,当然,如果验证码很有规律,或者说很清楚,漂亮,那么也是可能被程序识别的,我以前就识别过某网站的验证码,因为比较有规律,所以被识别了,并且识别率达到99%左右,其实我们可以制作很复杂一点的验证码,添加一些干扰的线条或者字体变形,使程序识别的难度加大,这样,我们的目的也就达到了.
下面是生成的图片:

package com.hadeslee;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Paint;
import java.awt.Point;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;
/**
*
* @author lbf
* @version
*/
public class Code extends HttpServlet {
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
private List<String> fonts=new ArrayList<String>();
public Code(){
initFonts();
}
private void initFonts(){
GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
String[] names=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
for(String s:names){
char c=s.charAt(0);
if(Character.isLowerCase(c)||Character.isUpperCase(c)){
}else{
fonts.add(s);
}
}
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream out=response.getOutputStream();
BufferedImage bi=new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
Graphics2D g=bi.createGraphics();
char[] cs={'0','1','2','3','4','5','6','7','8','9'};
char[] use=new char[4];
g.setColor(new Color(240,240,240));
g.fillRect(0,0,200,50);
for(int i=0;i<4;i++){
Point p=getPoint(i);
int size=getSize();
use[i]=cs[(int)(Math.random()*cs.length)];
// g.setColor(new Color((int)(Math.random()*256),0,(int)(Math.random()*256)));
g.setPaint(getPaint(p,size));
g.setFont(new Font(fonts.get((int)(Math.random()*fonts.size())),getFace(),size));
g.drawString(""+use[i],p.x,p.y);
}
g.setStroke(new BasicStroke(1.0f));
g.setPaint(null);
for(int i=0;i<4;i++){
g.setColor(new Color((int)(Math.random()*0x00FFFFFFF)));
g.drawLine((int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
}
Random random = new Random();
for (int i=0;i<88;i++) {
int x = random.nextInt(200);
int y = random.nextInt(50);
g.setColor(new Color((int)(Math.random()*0x00FFFFFFF)));
g.setStroke(getStroke());
g.drawLine(x,y,x,y);
}
ImageIO.write(bi,"JPEG",out);
out.close();
g.dispose();
}
private Stroke getStroke(){
BasicStroke bs=new BasicStroke((float)(Math.random()*3));
return bs;
}
private Point getPoint(int index){
return new Point(5+(index*((int)(Math.random()*10)+40)),40);
}
private Paint getPaint(Point p,int size){
GradientPaint gp=new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
p.x,p.y-size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)));
return gp;
}
private int getFace(){
if(Math.random()*10>5){
return Font.BOLD;
}else{
return Font.ITALIC;
}
}
private int getSize(){
int[] sizes=new int[20];
for(int i=0;i<20;i++){
sizes[i]=30+i;
}
return sizes[(int)(Math.random()*sizes.length)];
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
分享到:
相关推荐
在这个"验证码随机生成数字类"中,我们将深入探讨如何使用编程语言生成这种随机数字验证码。 验证码的核心在于它的随机性和不可预测性。在描述中提到,这里的验证码是通过二进制流生成的,这意味着它不仅包含了数字...
在PHP中,生成随机数字验证码是一项常见的功能,用于网站的安全验证,例如登录、注册或防止自动机器人操作。验证码的主要目的是确保用户是人类而非自动化程序。接下来,我们将详细探讨如何使用PHP来实现这一功能。 ...
随机验证码。 - 随机生成十组六位字符组成的验证码。 - 验证码由大小写字母、数字字符组成。
一、源码特点 采用winform进行开发实现随机数字验证码功能二、功能介绍 本源码是一个随机数字验证码源码,适合初学者,欢迎下载三、菜单功能 1、运行后,随机生成验证码,刷新就会重新随机数 2、根据生成的...
使用这个“随机生成验证码工具jar包”,开发者无需从头实现以上所有功能,只需将其引入项目,按照提供的API或示例进行调用,就可以快速地为应用添加安全的验证码生成和验证功能。 总之,这个jar包简化了验证码的...
本项目“jsp随机验证码生成测试”提供了一个基于Java Server Pages (JSP) 实现的验证码生成实例,旨在帮助开发者理解和实践如何在Web应用程序中集成验证码功能。 验证码的主要目的是验证用户是人而不是计算机程序。...
本项目着重于JSP页面上的验证码生成,结合后台Java代码,提供了一个完整的解决方案。 首先,验证码的核心在于其随机性和不可预测性。在JSP页面上,通常会有一个专门的图片元素显示验证码。这个图片是由服务器动态...
本文将详细介绍如何在WinForm应用程序中实现一个随机生成的验证码功能。 首先,验证码的核心是生成一组随机的字符序列,并将其以图像的形式展示出来,同时增加一定的干扰元素,以增加机器识别的难度。以下是一个...
### 方法一:基于Math.random()的简单验证码生成 `Math.random()`是Java(包括Android)中内置的一个方法,用于生成0到(1.0 - Double.MIN_VALUE)之间的伪随机数。我们可以通过它来生成验证码。以下是一个简单的示例...
总的来说,JSP生成的数字验证码结合了Java的强大功能和网页的交互性,提供了一种简单而有效的用户验证方法。在开发过程中,确保验证码的安全性和用户体验是至关重要的。通过对验证码的不断刷新和复杂化设计,我们...
首先,我们要生成随机数字或字母。在Java中,可以使用`java.util.Random`类来生成随机数。例如,如果我们想要生成4位数字的验证码,可以创建一个`Random`对象,并调用`nextInt(10)`方法四次,每次都在0到9之间获取一...
GetCode(ASP验证码生成代码) 以上源码:完全免费的传统ASP的VBScript 。 安全码是完全随机的。 动态图像处理。 没有图像文件的要求。 没有组件需要。 创建一个跨浏览器兼容的动态随机captcha图像。 您...
ASP.net数字验证码生成,并且判断验证码输入是否正确的例子,ASP.NET生成基于数字和随机数的验证码例子,学习下如何在ASP.NET中调用和生成数字图形的验证码。如示例所示,在一个登录页上使用本代码生成的数字验证码...
java随机产生验证码,可以随机生成数字、大写字母、小写字母。还可以随机生成文字字体、及大小。在图片上面可能字体都不不同、大小不等。
在Java中,我们可以创建一个自定义的验证码生成器来实现这一功能。这个过程通常包括以下几个关键步骤: 1. **随机字符生成**: 验证码通常由字母、数字或者两者的组合构成。在Java中,可以使用`Random`类生成随机...
把本页面放入web工程,加入IMAGE,它的imageUrl设成ValidateCode.aspx搞定,可实现随机生成验证码。验证代码:protected void btnLogin_Click(object sender, EventArgs e) { if (Session[ValidateCode....
// 验证码生成 QString generateCode() { QString code; for (int i = 0; i ; ++i) { int index = QRandomGenerator::global()->generate() % chars.length(); code.append(chars.mid(index, 1)); } return ...
6. **随机字符串**:验证码的字符集通常是随机的字母和数字组合,长度也可能是可变的,这样可以生成多种可能的验证码。 在实际应用中,PHP动态验证码类通常包含以下步骤: 1. **初始化**:设置验证码的基本参数,...
- **安全性**:定期更换验证码生成算法,防止攻击者通过分析模式破解。同时,限制同一验证码的使用次数和有效期。 6. **文件名“验证码的识别”可能包含的内容** 这个文件可能是关于验证码识别技术的文档或代码...
验证码生成 验证码的生成由`generate_random()`方法完成,该方法基于`allchars`和`singles`变量的值来确定字符集。如果`allchars`为真,则从ASCII码34到126(共93个字符)范围内随机选择字符;如果`singles`为真,...