1. 程式人生 > >前端+servlet獲得驗證碼圖片

前端+servlet獲得驗證碼圖片

網頁通過servlet獲得驗證碼圖片,並且可以點選更新

jsp中

<img src="/MYSystem/servlet/ImageServlet" onClick="refresh(this);" />

<script>
function refresh(obj){
    obj.src="/MYSystem/servlet/ImageServlet?"+Math.random();
}
</script>

注意:必須要有Math.random()才能點選重新整理,不然瀏覽器認為圖片地址沒有發生改變,圖片不會重新整理。

public void doGet(HttpServletRequest req,HttpServletResponse res)throws IOException,ServletException{
		res.setContentType("image/jpeg");//設定響應型別,告訴瀏覽器輸出的內容為圖片
		res.setHeader("Pragma","No-cache");//設定響應頭資訊,告訴瀏覽器不要快取此內容  欄位名 欄位值
		res.setHeader("Cache-Control","nocache");
		res.setDateHeader("Expire",0);
		RandomValidate validate=new RandomValidate();
		try{
			validate.getRandom(req,res);//輸出圖片
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	public void doPost(HttpServletRequest req,HttpServletResponse res)throws IOException,ServletException{
		doGet(req,res);
	}

RandomValidate類

    public static final String RANDOMCODEKEY="codekey";//sessionID
	private Random random=new Random();//random物件
	private String randString="123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

	private int width=80;//圖片寬
	private int height=25;//圖片高
	private int lineSize=40;//干擾線數量
	private int stringNum=4;//隨機字元數量
	/*
	*獲得字型
	*/
	private Font getFont(){
		return new Font("Fixedsys",Font.CENTER_BASELINE,18);//字的特徵
	}
	/*
	*生成隨機圖片
	*/
	public void getRandom(HttpServletRequest req,HttpServletResponse res){
		HttpSession session=req.getSession();
		BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
		Graphics g=image.getGraphics();//產生BUfferedImage的物件Graphics物件,該物件可以在圖片上進行繪製操作
		g.fillRect(0,0,width,height);//矩形的 座標 及 長 寬
		g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
		g.setColor(new Color(118,36,48));//隨機顏色
		//繪製干擾線
		for(int i=0;i<=lineSize;i++){
			draw(g);
		}
		//繪製隨機字元
		String randomString= "";//注意前面必須要有空格
		for(int i=1;i<=stringNum;i++){
			randomString=drawS(g,randomString,i);
		}
		session.setAttribute(RANDOMCODEKEY, randomString);//randomString 是獲得的驗證碼字串
		g.dispose();//釋放資源
		try{
			ImageIO.write(image, "JPEG", res.getOutputStream());//將記憶體中的圖片通過流的形式輸到客戶端
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	//繪製字串
	private String drawS(Graphics g,String randomString,int i){
		g.setFont(getFont());//重獲得驗證碼字元的字型
		g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));//重獲隨機顏色
		String rand=String.valueOf(getRandom(random.nextInt(randString.length())));//從字串的長度裡隨機獲得字串
		randString+=rand;
		g.translate(random.nextInt(3),random.nextInt(3));//就是將random.nextInt(3) random.nextInt(3)變成原點
		g.drawString(rand,13*i,16);
		return randomString;
	}
	//繪製干擾線
	private void draw(Graphics g){
		int x=random.nextInt(width);
		int y=random.nextInt(height);
		int x1=random.nextInt(13);
		int y1=random.nextInt(15);
		g.drawLine(x,y,x+x1,y+y1);
	}
	//獲得隨機字元
	private String getRandom(int num){
		return String.valueOf(randString.charAt(num));//獲得12345..xyz的隨機字串  注:char  String.charAt(i)獲得i處索引的值

	}

最終結果