验证码 的生成类

<input type="text" maxlength="4" tabindex="3" class="ipt_tt ipt_random" name="authorcode" id="authorcode"/>
<img id="randomCodeImg" src="getAuthcode.do"  onclick="this.src='getAuthcode.do?id=' + Math.random()" style="vertical-align: middle;"  alt="验证码" title="如果看不清楚,请点图片重新生成" />


package com.s.controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import com.s.controller.BaseController;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class AuthcodeController extends BaseController {

static final long serialVersionUID = 19881218;  //明明的生日
   
  
  @RequestMapping("/getAuthcode.do")
   public void getAuthcode(HttpServletRequest request,HttpServletResponse response) throws IOException{
      
    response.setContentType("image/jpeg");
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires", 0);
        // 在内存中创建图象
        int width=60, height=20;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // 获取图形上下文
        Graphics g = image.getGraphics();

        //生成随机类
        Random random = new Random();

        // 设定背景色
        g.setColor(new Color(255,255,255));
        g.fillRect(0, 0, width, height);


        //设定字体
        g.setFont(new Font("Comic Sans MS",Font.PLAIN,18));
        //画边框
        g.setColor(this.getRndColor());
        //  g.drawRect(0,0,width-1,height-1);

        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(this.getRndColor());
        for (int i=0;i<10;i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x,y,x+xl,y+yl);
        }


        // 取随机产生的认证码(4位数字)
        String sRand="";
        for (int i=0;i<4;i++){
            String rand=String.valueOf(random.nextInt(10));
            sRand+=rand;
            // 将认证码显示到图象中
            g.setColor(new Color(127,127,127));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
            g.drawString(rand,13*i+6,16);
        }
        request.getSession().setAttribute("acode",sRand);
        // 图象生效
        g.dispose();
        ServletOutputStream responseOutputStream =response.getOutputStream();
        // 输出图象到页面
        ImageIO.write(image, "JPEG", responseOutputStream);

        //以下关闭输入流!
        responseOutputStream.flush();
        responseOutputStream.close();
    }

// 检查验证码正不正确
@RequestMapping("/isokAuthcode.do")
public void isokAuthcode(){

}
 
private  Color getRndColor(){//给定范围获得随机颜色
        return new Color(this.rnd(),this.rnd(),this.rnd());
    }
  
 
/**随机生成0-255的数字**/
    private int rnd(){
        java.util.Random random = new java.util.Random();
        return random.nextInt(255);
    }
/**把除了大小写字母和数字外的字符全过滤掉**/
    private char filter(int k){
        if(k<65)k=48+(k%10);
        if(k>64&&k<96)k=65+(k%26);
        if(k>96)k=97+(k%26);
        return (char)k;
    }
/**取得一个随机字体**/
    private String getRndFontNames(){
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] k = ge.getAvailableFontFamilyNames();
        java.util.Random r = new java.util.Random();
        return k[r.nextInt(k.length)];
    }


}

你可能感兴趣的:(java,Web,cache,servlet)