jsp+servlet 驗證碼 (包含看不清,換一張)的程式碼
servlet類:
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Random;
import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
/** * Servlet implementation class CheckCode */ @WebServlet("/CheckCode") public class CheckCode extends HttpServlet { private static final long serialVersionUID = 1L; private static final int Width = 90;// 定義圖片的寬度; private static final int height = 20;// 定義圖片的長度; private static int codeCount = 4;// 圖片上顯示的驗證碼個數; private static int xx = 15; private static int fontheight = 18; private static int codeY = 16; private static char[] codesequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BufferedImage buffimg=new BufferedImage(Width,height,BufferedImage.TYPE_INT_RGB);//建立一個不帶透明的影象物件 Graphics gd=buffimg.getGraphics();//用影象物件去獲取一個繪畫物件 // 建立一個隨機數生成器類 Random random = new Random(); // 將影象填充為白色 gd.setColor(Color.WHITE); gd.fillRect(0, 0, Width, height); // 建立字型,字型的大小應該根據圖片的高度來定。 Font font = new Font("Fixedsys", Font.BOLD, fontheight); gd.setFont(font); // 畫邊框。 gd.setColor(Color.BLACK); gd.drawRect(0, 0, Width - 1, height - 1); // 隨機產生30條幹擾線,使圖象中的認證碼不易被其它程式探測到。 gd.setColor(Color.BLACK); for (int i = 0; i < 30; i++) { int x = random.nextInt(Width);//x為Width裡面的隨機一個數 int y = random.nextInt(height); int xl = random.nextInt(12);//x1為12以內的一個數 int yl = random.nextInt(12); gd.drawLine(x, y, x + xl, y + yl); } // randomCode用於儲存隨機產生的驗證碼,以便使用者登入後進行驗證。 StringBuffer randomCode = new StringBuffer(); int red = 0, green = 0, blue = 0; // 隨機產生codeCount數字的驗證碼。 for (int i = 0; i < codeCount; i++) { // 得到隨機產生的驗證碼數字。 String code = String.valueOf(codesequence[random.nextInt(36)]); // 產生隨機的顏色分量來構造顏色值,這樣輸出的每位數字的顏色值都將不同。 red = random.nextInt(255); green = random.nextInt(255); blue = random.nextInt(255); // 用隨機產生的顏色將驗證碼繪製到影象中。 gd.setColor(new Color(red, green, blue)); gd.drawString(code, (i + 1) * xx, codeY); // 將產生的四個隨機數組合在一起。 randomCode.append(code); } Map<String,Object> map =new HashMap<String,Object>(); //存放驗證碼 map.put("code", randomCode); //存放生成的驗證碼BufferedImage物件 map.put("codePic", buffimg); ImageIO.write((RenderedImage) map.get("codePic"), "jpg", response.getOutputStream());//將這個驗證碼圖片讀寫到頁面中
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } } jsp頁面程式碼:
<%@ page pageEncoding="UTF-8"%> <script type="text/javascript" src="jquery-1.12.0.min.js"></script>//jquery外掛,但是我這裡沒有使用 <script type="text/javascript"> function reImg() { var img = document.getElementById("Img"); img.src = "../CheckCode?rnd=" + Math.random();//重新整理CheckCode這個servlet,即驗證碼 } </script> <img id="Img" src="../CheckCode"> <a href="#" onclick="reImg()">看不清,換一張</a>
這裡的CheckCode就是上面的servlet類,驗證碼點選一下就改變是改變這個圖片的src,而這個src就是servlet程式碼,所以只要改變servlet程式碼的傳參(隨便定義)