Java生成验证码的代码

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
package com.web;
//验证码生成处理类
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());
		
	}

}

标签: isp

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇: Java实现字符串反转的8种9种方法

下一篇: Android剪裁图片简单的方法