BufferedImage類
創建一個BufferImage servlet,用來生成驗證碼圖片:
package com.fpc; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; 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; public class BufferImage extends HttpServlet { public static final int WIDTH = 120;//生成圖片的寬度 public static final int HEIGHT = 30;//生成圖片的高度 public static final int WORDS_NUMBER = 5;//驗證碼中字符的個數 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String createTypeFlag = req.getParameter("createTypeFlag");//接收客戶端傳遞的createTypeFlag標識 //在內存中創建一張圖片 BufferedImage bi = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_3BYTE_BGR); //得到圖片 Graphics g = bi.getGraphics(); //設置圖片的背景色 setBackGround(g); //設置圖片的邊框 setBorder(g); //在圖片上畫干擾線 drawRandomLine(g); //在圖片上放上隨機字符 String randomString = this.drawRandomNum((Graphics2D)g, createTypeFlag); //將隨機數存在session中 req.getSession().setAttribute("checkcode", randomString); //設置響應頭通知瀏覽器以圖片的形式打開 resp.setContentType("image/jpeg"); //設置響應頭控制瀏覽器不要緩存 resp.setDateHeader("expries", -1); resp.setHeader("Cache-Control", "no-cache"); resp.setHeader("Pragma", "no-cache"); //將圖片傳給瀏覽器 ImageIO.write(bi, "jpg", resp.getOutputStream()); } //設置圖片背景色 //@param g private void setBackGround(Graphics g) { //設置顏色 g.setColor(Color.WHITE); //填充區域 g.fillRect(0, 0, WIDTH, HEIGHT); } /* * 設置圖片的邊框 * @param g * */ private void setBorder(Graphics g) { //設置邊框顏色 g.setColor(Color.BLUE); //邊框區域 g.drawRect(1, 1, WIDTH - 2, HEIGHT -2); } /* * 在圖片上畫隨機線條 * @param g * */ private void drawRandomLine(Graphics g) { //設置顏色 g.setColor(Color.GREEN); //設置線條個數並畫線 for ( int i = 0 ; i < 3 ; i++ ) { int x1 = new Random().nextInt(WIDTH); int y1 = new Random().nextInt(HEIGHT); int x2 = new Random().nextInt(WIDTH); int y2 = new Random().nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2); } } /* * 在圖片上畫隨機字符 * @param g * @param createTypeFlag * @return String * */ private String drawRandomNum(Graphics g,String createTypeFlag) { //設置顏色 g.setColor(Color.RED); g.setFont(new Font("宋體",Font.BOLD,20)); //數字字母的組合 String baseNumLetter = "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ"; String baseNum = "0123456789"; String baseLetter = "ABCDEFGHJKLMNOPQRSTUVWXYZ"; if ( createTypeFlag != null && createTypeFlag.length() > 0 ) { if( createTypeFlag.equals("nl") ) { //截取數字和字母的組合 return createRandomChar((Graphics2D) g,baseNumLetter); } else if ( createTypeFlag.equals("n") ) { //截取數字的組合 return createRandomChar((Graphics2D) g,baseNum); } else if ( createTypeFlag.equals("l") ) { //截取字母的組合 return createRandomChar((Graphics2D) g,baseLetter); } } else { //截取數字和字母的組合 return createRandomChar((Graphics2D) g,baseNumLetter); } return ""; } /* * 創建隨機字符 * @param g * @param baseChar * @return String * */ private String createRandomChar(Graphics2D g , String baseChar) { StringBuffer b = new StringBuffer(); int x = 5; String ch = ""; for ( int i = 0 ; i < WORDS_NUMBER ; i++ ) { //設置字體的旋轉角度 int degree = new Random().nextInt() % 30; ch = baseChar.charAt(new Random().nextInt(baseChar.length())) + ""; b.append(ch); //正向角度 g.rotate(degree * Math.PI / 180 , x,20); g.drawString(ch, x, 20); //反向角度 g.rotate(-degree * Math.PI / 180 , x,20); x+=30; } return b.toString(); } }
運行結果:
在Form表單中使用驗證碼圖片
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>在Form表單中使用驗證碼</title> <script type="text/javascript"> //刷新驗證碼 function changeImg(){ document.getElementById("validateCodeImg").src="image/checkcode?"+Math.random(); } </script> </head> <body> <form action="/image/checkcode" method="post"> 驗證碼:<input type="text" name="validateCode"/> <img alt="驗證碼看不清,換一張" src="image/checkcode" id="validateCodeImg" onclick="changeImg()"> <a href="javascript:void(0)" onclick="changeImg()">看不清,換一張</a> <br/> <input type="submit" value="提交"> </form> </body> </html>
運行結果:
服務器端對form表單提交上來的驗證碼處理
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>在Form表單中使用驗證碼</title> <script type="text/javascript"> //刷新驗證碼 function changeImg(){ document.getElementById("validateCodeImg").src="image/checkcode?"+Math.random(); } </script> </head> <body> <form action="service/checkcode" method="post"> 驗證碼:<input type="text" name="validateCode"/> <img alt="驗證碼看不清,換一張" src="image/checkcode" id="validateCodeImg" onclick="changeImg()"> <a href="javascript:void(0)" onclick="changeImg()">看不清,換一張</a> <br/> <input type="submit" value="提交"> </form> </body> </html>
CheckServlet:
package com.fpc; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CheckServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub // TODO Auto-generated method stub String clientCheckcode = req.getParameter("validateCode"); String serverCheckcode = (String) req.getSession().getAttribute("checkcode"); if ( clientCheckcode.contentEquals(serverCheckcode) ) { System.out.println("驗證通過"); } else { System.out.println("驗證失敗"); } } }
運行結果: