有时候在我们的网络应用中,防止程序自动登录搞破坏,我们一般都会加上验证码,这些验证码一般来说都是由人来识别的,当然,如果验证码很有规律,或者说很清楚,漂亮,那么也是可能被程序识别的,我以前就识别过某网站的验证码,因为比较有规律,所以被识别了,并且识别率达到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>
}
分享到:
相关推荐
随机验证码。 - 随机生成十组六位字符组成的验证码。 - 验证码由大小写字母、数字字符组成。
一、源码特点 采用winform进行开发实现随机数字验证码功能二、功能介绍 本源码是一个随机数字验证码源码,适合初学者,欢迎下载三、菜单功能 1、运行后,随机生成验证码,刷新就会重新随机数 2、根据生成的...
php 随即生成数字验证码 包含有生成图片的的文件,和验证是否正确 步骤详细 简单明了
一般验证码都用是生成图片以表示数字的,这样才能够做到安全验证的作用,这个代码里,是以二进制流的方式随机生成各种不同颜色跟数字的验证码。
用JSP生成随机数字验证码,数字验证码是图片形式的。通过点击按钮,可以实现对数字验证码的刷新。
winform随机生成验证码案例
ASP.net数字验证码生成,并且判断验证码输入是否正确的例子,ASP.NET生成基于数字和随机数的验证码例子,学习下如何在ASP.NET中调用和生成数字图形的验证码。如示例所示,在一个登录页上使用本代码生成的数字验证码...
java随机产生验证码,可以随机生成数字、大写字母、小写字母。还可以随机生成文字字体、及大小。在图片上面可能字体都不不同、大小不等。
把本页面放入web工程,加入IMAGE,它的imageUrl设成ValidateCode.aspx搞定,可实现随机生成验证码。验证代码:protected void btnLogin_Click(object sender, EventArgs e) { if (Session[ValidateCode....
一款简单又实用的jQuery随机生成验证码插件代码,随机生成字母数字混合验证码图片显示,点击图片更换验证码。
Android中两种方式随机生成验证码源代码, 可验证是否正确。
JSP随机验证码随机生成样式验证码的格式是1-9的随机数字和1-z的小写字母
用java编写的四位随机的验证码,包括数字跟字母 简单易懂
jsp的一个验证码生成实例,工程部署成功后,在浏览器输入下面这个地址:http://localhost:8080/randompic/checkcode.jsp 进入验证码测试页面。
GetCode(ASP验证码生成代码) 以上源码:完全免费的传统ASP的VBScript 。 安全码是完全随机的。 动态图像处理。 没有图像文件的要求。 没有组件需要。 创建一个跨浏览器兼容的动态随机captcha图像。 您...
本程序实现了实现了随机数字验证码数据集建立实现,验证码的字符含有大小写字母和数字,以及可以随机设置多张验证码图片生成,验证码字符长度为4,也可以根据项目需要进行设定。
本文档讲述了如何使用java来随机的生成验证码
本程序是采用Windows GDI+技术模拟Web上的验证码生成而设计的一款Windows版验证码随机生成程序,利用GDI+图形图像处理技术,可随机生成强验证码(即汉字验证码)或弱验证码(即数字和字母组合验证码),支持验证码的...
Android随机生成验证码View,支持数字,字母,数字字母混合,汉子验证码,可以设置验证码位数等.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
from captcha.image import ImageCaptcha import random as r ic = ImageCaptcha() l = [] for i in range(4): j = r.randint(0, 9) l.append(j) print(l) s = "{}{}{}{}".format(*l) ...ic.write(s, 'test' + '.png...