- 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());
- }
- }
来源: http://www.phpxs.com/code/1002420/