Servlet使用response生成圖片驗證碼
阿新 • • 發佈:2019-01-23
在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,請以自己的配置為準)。
執行結果為: