JavaWeb-Servlet-通過servlet生成驗證碼圖片


 

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("驗證失敗");
                }
    }
    
}

運行結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM