`
rentianchou
  • 浏览: 69675 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java验证码生成方法(带中文哦)

阅读更多

效果图: 


代码:
PictureCheckCode.java

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
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;
import javax.servlet.http.HttpSession;

import com.tools.MD5;

public class PictureCheckCode extends HttpServlet{

 private static final long serialVersionUID = 1L;
 
 private Random rand=new Random();
 
 
 /**
  * 生成随机颜色
  *
  * @param   start  [int]
  * @param   end    [int]
  * @return  Color  [object]
  */
 public Color getRandColor(int start,int end){
  int randNum;
  if(start>255) start=255;
  if(end>255) end=255;
  if(start>end) randNum=start-end;
  else randNum=end-start;
  int r=start+rand.nextInt(randNum);
  int g=start+rand.nextInt(randNum);
  int b=start+rand.nextInt(randNum);
  return new Color(r,g,b);
 }
 
 
 /**
  * 着色\旋转\缩放
  *
  * @param word 文字
  * @param g    图片对象
  */
 public void coloredAndRotation(String word,int i,Graphics g){
  /**着色**/
  g.setColor(new Color(20+rand.nextInt(110),20+rand.nextInt(110),20+rand.nextInt(110)));
  /**旋转**/
  Graphics2D g2d=(Graphics2D)g;
  AffineTransform trans=new AffineTransform();
  trans.rotate(rand.nextInt(45)*3.14/180,15*i+8,7);
  /**缩放**/
  float scaleSize=rand.nextFloat()+0.8f;
  if(scaleSize>1f) scaleSize=1f;
  trans.scale(scaleSize, scaleSize);
  g2d.setTransform(trans);
  g.drawString(word,15*i+20,20);
 }
 
 /**
  * 生成100条干扰线
  *
  * @param g2d
  * @param width
  * @param height
  */
 public void getRandLine(Graphics2D g2d,int width,int height){
  for(int i=0;i<100;i++){
   int x=rand.nextInt(width-1);
   int y=rand.nextInt(height-1);
   int z=rand.nextInt(6)+1;
   int w=rand.nextInt(12)+1;
   
   BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
   Line2D line=new Line2D.Double(x,y,x+z,y+w);
   g2d.setStroke(bs);
   g2d.draw(line);
  }
 }
 
 /**
  * 获取随机文字
  *
  * @param  length [int]        验证码长度
  * @param  g      [Graphics]   图片对象
  * @return String
  * @case1:A-Z
  * @case2:chinese
  * @default:0-9
  */
 @SuppressWarnings("unused")
 public String getRandWord(int length,Graphics g){
  String finalWord="",firstWord="";
  int tempInt=0;
  String[] array={
    "0","1","2","3",
    "4","5","6","7",
    "8","9","a","b",
    "c","d","e","f"};
  
  for(int i=0;i<length;i++){
   switch(rand.nextInt(2)){
    case 1:
      tempInt=rand.nextInt(26)+65;
      firstWord=String.valueOf((char)tempInt);
      break;
    /*case 2:
      int r1,r2,r3,r4;
      String strH,strL;//high&low
      r1=rand.nextInt(3)+11; //前闭后开[11,14)
      if(r1==13){
       r2=rand.nextInt(7);
      }else{
       r2=rand.nextInt(16);
      }
      
      r3=rand.nextInt(6)+10;
      if(r3==10){
       r4=rand.nextInt(15)+1;
      }else if(r3==15){
       r4=rand.nextInt(15);
      }else{
       r4=rand.nextInt(16);
      }
      
      strH=array[r1]+array[r2];
      strL=array[r3]+array[r4];
      
      byte[] bytes=new byte[2];
      bytes[0]=(byte)(Integer.parseInt(strH,16));
      bytes[1]=(byte)(Integer.parseInt(strL,16));
      
      firstWord=new String(bytes);
      break;*/
    default:
      tempInt=rand.nextInt(10)+48;
      firstWord=String.valueOf((char)tempInt);
      break;
   }
   finalWord+=firstWord;
   this.coloredAndRotation(firstWord,i, g);
  }
  
  return finalWord;
 }

 protected void service(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  
  //设制不缓存图片
  response.setHeader("Pragma","No-cache");
  response.setHeader("Cache-Control","No-cache");
  response.setDateHeader("Expires",0);
  
  //生成图片
  response.setContentType("image/jpeg");
  int width=100;
  int height=40;
  BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  
  Graphics g=image.getGraphics();
  Graphics2D g2d=(Graphics2D)g;
  Font mFont=new Font("宋体",Font.BOLD,22);
  g.setColor(this.getRandColor(200,250));
  g.fillRect(0, 0, width, height);
  g.setFont(mFont);
  g.setColor(this.getRandColor(180,200));
  
  this.getRandLine(g2d, width, height);
  
  String randCode=this.getRandWord(4, g);
  
  HttpSession session=request.getSession();
  session.setAttribute("randCode",MD5.code(randCode.toLowerCase()));
  
  g.dispose();
  
  ImageIO.write(image,"JPEG",response.getOutputStream());
  
 }
}

转载地址:http://www.dukai168.cn/blog/5.html

分享到:
评论

相关推荐

    70.java验证码生成.zip

    70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java...

    java验证码生成验证

    csdn上三种java验证码生成方法,以及谷歌开源验证码,总共四种验证码生成集合。将生成的四个验证图片放在一个页面上以供比对,全部可以运行。 四种方法分别为: 1. 数字、字母、汉字混合验证码,叠影(给力)、扭曲 ...

    java验证码生成类

    这篇博客文章“java验证码生成类”提供了一个简单的示例,下面我们将深入探讨验证码生成的相关知识点。 首先,验证码的基本原理是生成一段随机的、难以由机器识别的文字或数字序列,然后要求用户在限定时间内输入这...

    验证码生成工具类

    这个工具类是用Java语言编写的,因此我们可以深入探讨一下Java验证码生成的相关技术和实现。 验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart)的主要目标是区分...

    Java验证码生成库 JCaptcha

    Java验证码生成库 JCaptcha

    java验证码生成

    "Java验证码生成"这个主题涵盖了如何在Java环境中创建这种安全功能。以下是对这个话题的详细解释: 验证码通常由一串随机字符组成,这些字符可能是数字、字母或者两者的组合,它们被设计成难以通过计算机程序自动...

    Java生成算数运算中文图片验证码

    Java生成算数运算中文图片验证码的实现,结合了编程语言、图像处理和安全验证的多种技术,为用户提供了一种既安全又友好的验证方式。下面我们将深入探讨这个主题。 首先,验证码的核心是生成随机的算数运算表达式。...

    java验证码生成,数字+字母

    java验证码生成,数字+字母 史上最牛逼的验证码,很好用的,不信试试。

    java后台生成背景透明的验证码

    java后台生成背景色透明验证码的方法,可直接调用。本方法只生成随机字符数字组成的四位验证码。

    Java生成图片验证码工具类源码

    该工具类使用随机字符生成验证码,并支持自定义验证码长度和字体样式。生成的验证码图片背景透明,线条清晰,可轻松辨认。本源码包含了工具类源码及调用示例,可供开发者参考使用,集成到您的项目中。

    Jcaptcha(java验证码生成框架)使用说明(原创)

    Jcaptcha(Java 验证码生成框架)使用说明 一、框架概述 Jcaptcha 是一个 Java 验证码生成框架,提供了详细的说明及例程,通过调查实践后,总结的,希望对大家有帮助。该框架提供了生成验证码图像通用解决办法,...

    Java验证码生成器.rar

    用Java写了一个4位(可多位)验证码生成器,封装在一个类里,只需调用一个方法,写入生成图片的类型和生成图片路径,可直接生成验证码,并返回验证码信息。 最简单的使用方法:解压包后,进入captcha文件夹,双击...

    java登录验证码生成代码

    一个登录验证生成验证码用struts 后台生成验证码在jsp页面输出生成图片

    java 生成动态gif 验证码

    在Java开发中,生成动态GIF验证码是一种常见的安全机制,用于防止自动机器人或者恶意脚本对网站进行非法操作。这种验证码通常包含随机生成的字母、数字或者符号,以动画的形式展示,用户需要输入看到的验证码才能...

    验证码的生成工具 Java

    总之,这个Java验证码生成工具是一个实用的开发资源,它可以帮助开发者快速构建自己的验证码系统,同时也能为研究验证码识别技术提供实验平台。通过学习和理解这个工具的实现原理,开发者可以深入理解验证码的安全...

    Java随机生成六位验证码

    随机验证码。 - 随机生成十组六位字符组成的验证码。 - 验证码由大小写字母、数字字符组成。

    java生成随机加减法的图形验证码

    本话题主要关注如何使用Java生成包含随机加减法问题的图形验证码。这种验证码不仅增加了安全性,还为用户提供了验证他们是否为人类的互动方式。 首先,`IdentifyingCode.java`可能是一个类,它代表验证码对象,包含...

    JAVA源码Java验证码生成库JCaptcha

    JAVA源码Java验证码生成库JCaptcha

    java生成验证码的参考资料(中英文验证码)

    在Java开发中,生成验证码是一项基本技能。...通过学习和使用`kaptcha`或其他验证码生成库,开发者能够快速地在自己的项目中实现这一功能。同时,理解和实现验证码的生成也能加深对Java图形编程以及安全原理的理解。

    checkcode java验证码生成包

    checkcode(验证码) java验证码生成包

Global site tag (gtag.js) - Google Analytics