1. 程式人生 > >Servlet使用response生成圖片驗證碼

Servlet使用response生成圖片驗證碼

    在JavaWeb中伺服器對客戶端瀏覽器請求做出的響應會被封裝成一個HttpServletResponse物件,根據HttpServletResponse物件中的getWriter方法可以獲得一個PrintWriter物件,該物件可以實現TXT、word、Excel、PDF、MP3、JPEG等格式檔案的輸出,這裡演示JPEG圖片的輸出。

    在MyEclipse新建一個專案Image。在專案的src中新建名為servlet的包。在servlet中新建一個Servlet,命名為IdentityServlet.java。其程式碼如下

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.util.Random;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;


public class IdentityServlet extends HttpServlet {
	public static final char[] CHARS = {'2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y',
		'z','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'
	};//設定驗證碼字典,要排除容易引起混淆的字元,像0,O,L,I
	
	public static Random random = new Random();//例項化隨機數類
	public static String getRandomString(){//獲取6為隨機數
		StringBuffer buffer = new StringBuffer();//字串快取
		for(int i=0;i<6;i++){
			buffer.append(CHARS[random.nextInt(CHARS.length)]);  //從定義的驗證碼字典中隨機取一個字元
		}
		return buffer.toString();
	}
	public static Color getRandomColor(){  //獲取隨機的顏色
		return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)); //這裡可以根據頁面需要設定適合的顏色
	}
	public static Color getReverseColor(Color c){//返回某顏色的反色,前景色和背景色如果顏色相近會影響驗證碼的可視情況
		return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {  //處理使用get方式提交引數的方法
		response.setContentType("image/jpeg");  //設定輸出型別為圖片,必須設定的屬性
		String randomString = getRandomString();  //得到驗證碼的內容
		request.getSession(true).setAttribute("randomString",randomString);  //設定session
		
		int width = 200;
		int height = 130;
		
		Color color = getRandomColor();
		Color reverse = getReverseColor(color);
		
		BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //建立一個彩色圖片
		Graphics2D g = bi.createGraphics();  //獲取繪圖物件
		g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,32));  //設定字型
		g.setColor(color);     //設定顏色
		g.fillRect(0,0,width,height);  //繪製背景
		g.setColor(reverse); //設定相反顏色
		g.drawString(randomString,40,60);  //繪製驗證碼內容
		//新增噪點
		for(int i=0,n=random.nextInt(100);i<n;i++){ 
			g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
		}
		ServletOutputStream out = response.getOutputStream(); //轉換為JPEG格式
		
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		
		encoder.encode(bi);
		out.flush();
	}
}

    在專案的web.xml的根標籤中新增如下標籤

<servlet>
    <servlet-name>IdentityServlet</servlet-name>
    <servlet-class>servlet.IdentityServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>IdentityServlet</servlet-name>
    <url-pattern>/servlet/IdentityServlet</url-pattern>
  </servlet-mapping>

    在專案的WebRoot中建立檔案identity.html,程式碼為:

<html>
  <head>
    <title>identity.html</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <script>
  	function reloadImage(){
  		document.getElementById('btn').disabled=true;
  		document.getElementById('identity').src='servlet/IdentityServlet?ts='+new Date().getTime();
  	}
  </script>
  <body>
    <center>
    	<div>
    		<img src="servlet/IdentityServlet" id="identity" onload="btn.disabled=false;" />
    		<input type="button" value="換個圖片" onclick="reloadImage()" id="btn">
    	</div>
    </center>
  </body>
</html>

    儲存文件,在MyEclipse中將專案載入到Tomcat安裝目錄下的webapps或者直接將整個專案複製到webapps中,啟動Tomcat,在瀏覽器中輸入http://localhost:8888/Image/identity.html即可看到執行結果(埠號預設為8080,本人將自己的修改為8888,請以自己的配置為準)。

    執行結果為: