package com.work.core.image;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;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;import javax.servlet.http.HttpSession;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * @author wangmj * 產生隨機的驗證碼!防止暴利破解。 */public class AuthImage extends HttpServlet {private static Log log = LogFactory.getLog(AuthImage.class);/** * */private static final long serialVersionUID = 8165458985542870320L;//設定圖形驗證碼中的字串的字型的大小private Font mFont = new Font("Arial Black", Font.PLAIN, 16);public void init() throws ServletException {super.init();}/** * 產生隨機顏色 * @param fc * @param bc * @return */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);}/* (non-Javadoc) * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//產生伺服器相應的service方法//阻止產生的頁面內容被緩衝,保證每次重建隨機驗證碼response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);response.setContentType("image/jpeg");//指定圖形驗證碼圖片的大小;int width = 80;//寬度int height = 20;//高度BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);//準備在圖片中繪製內容Graphics g = image.getGraphics();Random random = new Random();g.setColor(getRandColor(200, 250));g.fillRect(1, 1, width - 1, height - 1);g.setColor(new Color(102, 102, 102));g.drawRect(0, 0, width - 1, height - 1);g.setFont(mFont);g.setColor(getRandColor(160, 200));//產生隨機線條for (int i = 0; i < 155; i++) {int x = random.nextInt(width - 1);int y = random.nextInt(height - 1);int xl = random.nextInt(6) + 1;int yl = random.nextInt(12) + 1;g.drawLine(x, y, x + xl, y + yl);}for (int i = 0; i < 70; i++) {int x = random.nextInt(width - 1);int y = random.nextInt(height - 1);int xl = random.nextInt(12) + 1;int yl = random.nextInt(6) + 1;g.drawLine(x, y, x - xl, y - yl);}String sRand = "";//產生隨機的字串並加入到圖片中int LEN = 2; //控制隨機碼的長度for (int i = 0; i < LEN; i++) {String tmp = getRandomChar();sRand += tmp;g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));g.drawString(tmp, 15 * i + 10, 15);}HttpSession session = request.getSession(true);log.debug("隨機產生的字串為"+sRand);//將其自動轉換為小寫。也就是說使用者在輸入驗證碼的時候,不需要區分大小寫,方便輸入。session.setAttribute("randomImageStr", sRand.toLowerCase());log.debug("從session中取出來"+session.getAttribute("randomImageStr"));g.dispose();ImageIO.write(image, "JPEG", response.getOutputStream());}/** * 隨機產生字串 * @return */private String getRandomChar() {int rand = (int) Math.round(Math.random() * 2);long itmp = 0;char ctmp = '/u0000';switch (rand) {case 1:itmp = Math.round(Math.random() * 25 + 65);ctmp = (char) itmp;return String.valueOf(ctmp);case 2:itmp = Math.round(Math.random() * 25 + 97);ctmp = (char) itmp;return String.valueOf(ctmp);default:itmp = Math.round(Math.random() * 9);return String.valueOf(itmp);}}}
在web.xml中配置這個servlet
<servlet> <servlet-name>authImage</servlet-name> <servlet-class>com.work.core.image.AuthImage</servlet-class> </servlet>
<servlet-mapping> <servlet-name>authImage</servlet-name> <url-pattern>/authImage</url-pattern> </servlet-mapping>
<img src="${pageContext.request.contextPath}/authImage" id="authImage" />