`

java生成验证码(支持中文)

    博客分类:
  • 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());    
      
 }    
}    

 

分享到:
评论

相关推荐

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

    总的来说,Java生成验证码是一个结合了数学随机性、图像处理和安全性考量的过程。通过学习和使用`kaptcha`或其他验证码生成库,开发者能够快速地在自己的项目中实现这一功能。同时,理解和实现验证码的生成也能加深...

    java生成图片的验证码工具类及其使用

    java生成验证码的工具类,这个现在有依赖可以直接引入调用,但这个工具类没有引入依赖,大家也容易看懂代码,理解其含义。也可直接去工具类中调整生成验证码的宽度、高度、颜色、背景颜色、生成的随机数数量、干扰线...

    java生成验证码demo

    这个"java生成验证码demo"提供了生成自定义验证码图片的方法,包括设置图片尺寸、验证码长度,以及添加各种视觉混淆元素,以增加机器识别的难度。 首先,我们要理解验证码的基本原理。它通常由一组随机生成的字母或...

    java生成验证码源码包括彩色验证码

    java生成验证码源码包括彩色验证码 包括jsp生成验证码和彩色验证码

    java生成验证码代码

    在Java中生成验证码涉及到图像处理、随机数生成以及字符编码等多个知识点。以下将详细介绍如何在Java中创建一个能生成中文、英文和数字的验证码。 1. **随机数生成**:首先,我们需要生成随机的验证码字符。Java...

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

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

    java生成随机验证码

    java生成随机验证码, 这是一个demo, eclipse项目,导入eclipse即可

    java生成图片验证码

    首先,我们来看标题"java生成图片验证码"。这个标题暗示我们将探讨的是在Java环境中生成随机的、可读性较差的文本,并将其转化为图像的过程,以创建一个验证码。验证码通常由字母、数字或两者混合组成,设计的目的...

    验证码生成工具类

    在Java中,生成验证码的步骤包括: 1. **设计验证码内容**:首先,我们需要创建一个包含随机字符或数字的字符串。可以使用`java.util.Random`类生成随机数,并结合字符数组生成随机字符串。为了增加难度,通常会...

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

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

    java 生成动态gif 验证码

    - **安全性**:可以考虑使用更复杂的算法生成验证码,如汉字、自定义图形等,提高机器识别的难度。 - **用户体验**:减少动画帧数,避免过于复杂的干扰元素,确保验证码清晰易读。 - **可配置性**:允许开发者...

    java生成验证码代码(工程)

    java生成验证码代码 主要:一个生成验证码的servlet,一个jsp页面,另外还需要配置下web.xml即可

    java 生成图片验证码

    在IT领域,验证码(CAPTCHA)是一...在提供的压缩包文件“图片验证码生成”中,可能包含了实现上述功能的源代码示例,你可以通过学习和理解这些代码,加深对Java生成图片验证码的理解,并根据实际需求进行调整和优化。

    java随机生成验证码

    验证码(CAPTCHA)是一种用于验证用户是否为人类的自动化测试技术。...以上就是使用Java生成验证码的基本流程和关键知识点。通过调整各种参数和细节,可以根据实际需求定制出更复杂、更难被机器识别的验证码系统。

    java生成验证码图片的文件已完成测试

    java生成验证码图片的文件已完成测试

    Java随机生成验证码图片

    Java随机生成验证码图片,适用于web登录验证等。个人觉得很不错~

    java生成的随机验证码

    验证码是网络应用中常见的一种安全机制,用于防止自动...总的来说,Java生成随机验证码的过程涵盖了随机数生成、字符串处理、图像处理等多个编程领域。通过合理的设计和实现,可以创建出既安全又用户友好的验证码系统。

    70.java验证码生成.zip

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

    生成验证码.java 源代码

    生成验证码.java 生成四位验证码的Java源代码,欢迎下载使用!

Global site tag (gtag.js) - Google Analytics