JAVA驗證碼生成技術(上)
阿新 • • 發佈:2018-12-15
生成驗證碼的流程: 1.讀取成語資源包檔案裡面的成語 2.生成圖片 3.向session儲存圖片上的文字 4.把圖片輸出到頁面 流程如下: index.jsp
<body> <table width="80%" border="0" cellspacing="2" class="upline"> <tr> <td style="text-align: right; width: 20%">輸入驗證碼:</td> <td style="width: 50%"> <input type="text" class="textinput" /> </td> <td> </td> </tr> <tr> <td style="text-align: right; width: 20%;"> </td> <td rowspan="2" style="width: 50%"> <img src="${pageContext.request.contextPath}/imageCode" width="180" height="30" class="textinput" style="height: 30px;" id="img" /> <a href="javascript:void(0);" onclick="changeImage()">看不清換一張</a></br> <input type="button" value="提交" onclick="javascript:verificationcode()"> </td> </tr> </table> </body>
CheckImageServlet.java servlet伺服器端
/** * 生成驗證碼的工具類 */ public class CheckImageServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 集合中儲存所有成語 private List<String> words = new ArrayList<String>(); @Override public void init() throws ServletException { // 初始化階段,讀取new_words.txt // web工程中讀取檔案,必須使用絕對磁碟路徑 String path = getServletContext().getRealPath("/WEB-INF/new_words.txt"); try { BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(path), "utf-8")); String line; while ((line = reader.readLine()) != null) { words.add(line); } reader.close(); } catch (IOException e) { e.printStackTrace(); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 禁止快取 response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", -1); int width = 180; int height = 30; // 步驟一 繪製一張記憶體中圖片 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 步驟二 圖片繪製背景顏色 ---通過繪圖物件 Graphics graphics = bufferedImage.getGraphics();// 得到畫圖物件 --- 畫筆 // 繪製任何圖形之前 都必須指定一個顏色 graphics.setColor(getRandColor(200, 250)); graphics.fillRect(0, 0, width, height); // 步驟三 繪製邊框 graphics.setColor(Color.WHITE); graphics.drawRect(0, 0, width - 1, height - 1); // 步驟四 四個隨機數字 Graphics2D graphics2d = (Graphics2D) graphics; // 設定輸出字型 graphics2d.setFont(new Font("宋體", Font.BOLD, 18)); Random random = new Random();// 生成隨機數 int index = random.nextInt(words.size()); String word = words.get(index-1);// 獲得成語 // 定義x座標 int x = 10; for (int i = 0; i < word.length(); i++) { // 隨機顏色 graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110))); // 旋轉 -30 --- 30度 int jiaodu = random.nextInt(60) - 30; // 換算弧度 double theta = jiaodu * Math.PI / 180; // 獲得字母數字 char c = word.charAt(i); // 將c 輸出到圖片 graphics2d.rotate(theta, x, 20); graphics2d.drawString(String.valueOf(c), x, 20); graphics2d.rotate(-theta, x, 20); x += 40; } // 將驗證碼內容儲存session request.getSession().setAttribute("checkcode_session", word); // 步驟五 繪製干擾線 graphics.setColor(getRandColor(160, 200)); int x1; int x2; int y1; int y2; for (int i = 0; i < 30; i++) { x1 = random.nextInt(width); x2 = random.nextInt(12); y1 = random.nextInt(height); y2 = random.nextInt(12); graphics.drawLine(x1, y1, x1 + x2, x2 + y2); } // 將上面圖片輸出到瀏覽器 ImageIO graphics.dispose();// 釋放資源 ImageIO.write(bufferedImage, "jpg", response.getOutputStream()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * 取其某一範圍的color * @param fc int 範圍引數1 * @param bc int 範圍引數2 * @return Color */ private Color getRandColor(int fc, int bc) { // 取其隨機顏色 Random random = new Random(); if (fc > 255) { fc = 255; } if (bc > 255) { bc = 255; } int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); }
效果如圖