spring+struts2+mybatis整合的圖片驗證碼的實現

    傳統的網頁生成圖片驗證碼的原理比較簡單明瞭,在服務器端生成隨機的驗證碼講其存放在session中,而後映射出對應的圖片(一般在產生圖片是會給出必定的污染及扭曲),將其發送給瀏覽器顯示。用戶提交輸入的驗證碼,服務器將session中的驗證碼信息與用戶輸入的比較。 瀏覽器

    這裏主要講一下我的在ssm框架中使用圖片驗證碼的過程及主要的代碼。 緩存

    首先要建立一個action用於生成驗證碼。 服務器

    public class AuthCodeAction { 
    private HttpServletResponse response = ServletActionContext.getResponse(); 
    private HttpServletRequest request = ServletActionContext.getRequest(); 
 
    public String execute() { 
        try { 
            int width = 50; 
            int height = 18; 
            // 取得一個4位隨機字母數字字符串 
            String s = RandomStringUtils.random(4, true, true); 
 
            // 保存入session,用於與用戶的輸入進行比較. 
            // 注意比較完以後清除session. 
            HttpSession session = request.getSession(true); 
            session.setAttribute("authCode", s); 
 
            response.setContentType("images/jpeg"); 
            response.setHeader("Pragma", "No-cache"); 
            response.setHeader("Cache-Control", "no-cache"); 
            response.setDateHeader("Expires", 0); 
 
            ServletOutputStream out = response.getOutputStream(); 
            BufferedImage image = new BufferedImage(width, height, 
                    BufferedImage.TYPE_INT_RGB); 
            Graphics g = image.getGraphics(); 
            // 設定背景色 
            g.setColor(getRandColor(200, 250)); 
            g.fillRect(0, 0, width, height); 
 
            // 設定字體 
            Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 設置字體 
            g.setFont(mFont); 
 
            // 畫邊框 
            // g.setColor(Color.BLACK); 
            // g.drawRect(0, 0, width - 1, height - 1); 
 
            // 隨機產生干擾線,使圖象中的認證碼不易被其它程序探測到 
            g.setColor(getRandColor(160, 200)); 
            // 生成隨機類 
            Random random = new Random(); 
            for (int i = 0; i < 155; i++) { 
                int x2 = random.nextInt(width); 
                int y2 = random.nextInt(height); 
                int x3 = random.nextInt(12); 
                int y3 = random.nextInt(12); 
                g.drawLine(x2, y2, x2 + x3, y2 + y3); 
            } 
 
            // 將認證碼顯示到圖象中 
            g.setColor(new Color(20 + random.nextInt(110), 20 + random 
                    .nextInt(110), 20 + random.nextInt(110))); 
 
            g.drawString(s, 2, 16); 
 
            // 圖象生效 
            g.dispose(); 
            // 輸出圖象到頁面 
            ImageIO.write((BufferedImage) image, "JPEG", out); 
            out.close(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return null; 
    } 
 
    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); 
    } 
session

在struts.xml中配置action信息
   <action name="authCode" method="execute" class="AuthCodeAction" >  
   </action> 框架

最後在jsp頁面中使用: dom

<img src="common/authCode.action" alt="驗證碼" id="authCode" onclick="changeImg()">   
<a href="#" onclick="changeImg()">看不清,換一張!</a> jsp

changeImg()方法:(爲了解決瀏覽器的緩存驗證碼不刷新的問題,因此在url後面附加一個時間值使得每次的url路徑都不相同) 學習

 function changeImg(){      
        $("#authCode").attr("src","common/authCode.action?d="+new Date().valueOf());      
    } 字體

    代碼是參考別人的,在看了網上不少大神的代碼之後,以爲這種方法比較簡單,適合剛入門的人學習。 url

相關文章
相關標籤/搜索