java web中图形验证码的生成(英文和数字混合的验证码)
-
效果
-
技術要點
? ? ? ?在此項目中創建了CheckCode類,此類繼承了HttpServlet。在此CheckCode類中定義了public Color getRandColor(int s, int e) 方法用于隨機返回以Color對象(java.awt.Color)。接下來重寫了service函數,此函數的作用是生成BufferedImage對象,并在此對象轉型為Graphics對象,并繪制矩形,并設置顏色和字體等。然后將Graphics對象轉型為Graphics2D對象,通過設置AffineTransform對象添加縮放和旋轉方法。并通過setTransform()方法添加到Graphics2D對象。最后通過Graphics對象調用drawString()寫入字符。把生成的驗證碼保存到Session中,調用ImageIO.write(image, "JPEG", response.getOutputStream());函數將BufferedImage對象寫入JSP內置對象out中,out對象通過response.getOutputStream()來獲取。
-
項目結構
-
要點注意
? ? 2. 在index.jsp文件第51行,如下所示:
<td width="59%" style="padding-top:4px"><img src="CheckCode" id="createCheckCode"><a href="#"onClick="myReload()" > 看不清?換一個</a></td>? ? ? ?其中img標簽是顯示 驗證碼圖片,而其屬性src為CheckCode(原因是在web.xml中配置中<url-pattern>/CheckCode</url-pattern>),而當點擊“看不清?換一個”時調用myReload()函數,myReload()函數的主要作用是在src路徑加入時間參數,目的是當src路徑不變時,img標簽始終調用緩存資源,當src路徑改變時,才調用servlet中service來響應重新生成驗證碼。
-
關鍵代碼
CheckCode.java代碼如下:
package com;import java.awt.*; import java.awt.geom.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; 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;public class CheckCode extends HttpServlet {public CheckCode() {super();}public void destroy() {super.destroy(); }public void init() throws ServletException {super.init();}// 獲取隨機顏色public Color getRandColor(int s, int e) {Random random = new Random();if (s > 255) s = 255;if (e > 255) e = 255;int r = s + random.nextInt(e - s); //隨機生成RGB顏色中的r值int g = s + random.nextInt(e - s); //隨機生成RGB顏色中的g值int b = s + random.nextInt(e - s); //隨機生成RGB顏色中的b值return new Color(r, g, b);}public 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 = 86; //指定驗證碼的高度int height = 22; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//獲取Graphics類的對象Graphics g = image.getGraphics(); Graphics2D g2d = (Graphics2D) g;//實例化一個Random對象Random random = new Random(); //通過Font構造字體Font mFont = new Font("黑體", Font.BOLD, 17); //設置顏色g.setColor(getRandColor(200, 250)); //繪制驗證碼背景g.fillRect(0, 0, width, height); //設置字體g.setFont(mFont); //設置顏色g.setColor(getRandColor(180, 200)); // 畫隨機的線條,可有可無/*for (int i = 0; i < 100; i++) {//生成起始點x軸的坐標int x = random.nextInt(width - 1); //生成起始點y軸的坐標int y = random.nextInt(height - 1); //生成結束點x軸的坐標int x1 = random.nextInt(6) + 1; //生成結束點y軸的坐標int y1 = random.nextInt(12) + 1; BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);Line2D line = new Line2D.Double(x, y, x + x1, y + y1);g2d.setStroke(bs);g2d.draw(line); //繪制直線}*/String sRand = "";// 輸出隨機的驗證文字String ctmp = "";int itmp = 0;for (int i = 0; i < 4; i++) {if((random.nextInt(2)+1)==1){// 生成0~9的數字(ascll碼)itmp = random.nextInt(10) + 48; ctmp = String.valueOf((char) itmp);}else{// 生成A~Z的字母(ascll碼)itmp = random.nextInt(26) + 65;ctmp = String.valueOf((char) itmp);}sRand += ctmp;Color color = new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110));g.setColor(color); //設置文字顏色/** **隨機縮放文字并將文字旋轉指定角度* */// 將文字旋轉指定角度Graphics2D g2d_word = (Graphics2D) g;AffineTransform trans = new AffineTransform();trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 8, 7);// 縮放文字float scaleSize = random.nextFloat() +0.8f;if (scaleSize > 1f) {scaleSize = 1f;}//縮放trans.scale(scaleSize, scaleSize);g2d_word.setTransform(trans);/** ********************* */g.drawString(ctmp, 15 * i + 18, 14);}// 將生成的驗證碼保存到Session中HttpSession session = request.getSession(true);session.setAttribute("randCheckCode", sRand);//處理此圖形上下文并釋放其正在使用的任何系統資源。 g.dispose();ImageIO.write(image, "JPEG", response.getOutputStream());//保存圖片 JPEG表示保存格式//ImageIO.write(image,"JPEG",new FileOutputStream("D:\\a.jpg"));}}-
項目下載
本項目為Eclipse中的Dynamic Web Project,需要用Eclipse打開,點我下載項目。
總結
以上是生活随笔為你收集整理的java web中图形验证码的生成(英文和数字混合的验证码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP采集器querylist
- 下一篇: 如何把微信中的多个图片转为一个pdf文件