EasyCaptcha圖形驗證碼使用說明書


簡介

Java圖形驗證碼,支持gif、中文、算術等類型,可用於Java Web、JavaSE等項目。

效果圖

導入項目

<dependency>
    <groupId>com.github.whvcse</groupId>
    <artifactId>easy-captcha</artifactId>
    <version>1.6.2</version>
</dependency>

Jar包下載

https://gitee.com/whvse/EasyCaptcha/releases

使用方式

SpringMVC中使用

@Controller
public class CaptchaController {

    @RequestMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
        CaptchaUtil.out(request, response);
    }
}

html代碼:

<img src="/captcha" width="130px" height="48px" />

Servlet中使用

<web-app>
    <!-- 圖形驗證碼servlet -->
    <servlet>
        <servlet-name>CaptchaServlet</servlet-name>
        <servlet-class>com.wf.captcha.servlet.CaptchaServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CaptchaServlet</servlet-name>
        <url-pattern>/captcha</url-pattern>
    </servlet-mapping>
</web-app>

html代碼:

<img src="/captcha" width="130px" height="48px" />

判斷驗證碼是否正確

@Controller
public class LoginController {
    
    @PostMapping("/login")
    public JsonResult login(String username,String password,String verCode){
        if (!CaptchaUtil.ver(verCode, request)) {
            CaptchaUtil.clear(request);  // 清除session中的驗證碼
            return JsonResult.error("驗證碼不正確");
        }
    }   
}

設置寬高和位數

@Controller
public class CaptchaController {
    
    @RequestMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 設置位數
        CaptchaUtil.out(5, request, response);
        // 設置寬、高、位數
        CaptchaUtil.out(130, 48, 5, request, response);
        
        // 使用gif驗證碼
        GifCaptcha gifCaptcha = new GifCaptcha(130,48,4);
        CaptchaUtil.out(gifCaptcha, request, response);
    }
}

不使用工具類

CaptchaUtil封裝了輸出驗證碼、存session、判斷驗證碼等功能,也可以不使用此工具類:

@Controller
public class CaptchaController {
    
    @RequestMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 設置請求頭為輸出圖片類型
        response.setContentType("image/gif");
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        
        // 三個參數分別為寬、高、位數
        SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
        // 設置字體
        specCaptcha.setFont(new Font("Verdana", Font.PLAIN, 32));  // 有默認字體,可以不用設置
        // 設置類型,純數字、純字母、字母數字混合
        specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER);
        
        // 驗證碼存入session
        request.getSession().setAttribute("captcha", specCaptcha.text().toLowerCase());
        
        // 輸出圖片流
        specCaptcha.out(response.getOutputStream());
    }
    
    @PostMapping("/login")
    public JsonResult login(String username,String password,String verCode){
        // 獲取session中的驗證碼
        String sessionCode = request.getSession().getAttribute("captcha");
        // 判斷驗證碼
        if (verCode==null || !sessionCode.equals(verCode.trim().toLowerCase())) {
            return JsonResult.error("驗證碼不正確");
        }
    }  
}

更多設置

驗證碼類型

public class Test {
    public static void main(String[] args) {
        // png類型
        SpecCaptcha captcha = new SpecCaptcha(130, 48);
        captcha.text();  // 獲取驗證碼的字符
        captcha.textChar();  // 獲取驗證碼的字符數組
        
        // gif類型
        GifCaptcha captcha = new GifCaptcha(130, 48);
        
        // 中文類型
        ChineseCaptcha captcha = new ChineseCaptcha(130, 48);
        
        // 中文gif類型
        ChineseGifCaptcha captcha = new ChineseGifCaptcha(130, 48);
        
        // 算術類型
        ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);
        captcha.setLen(3);  // 幾位數運算,默認是兩位
        captcha.getArithmeticString();  // 獲取運算的公式:3+2=?
        captcha.text();  // 獲取運算的結果:5
        
        captcha.out(outputStream);  // 輸出驗證碼
    }
}

算術驗證碼的len表示是幾位數運算,而其他驗證碼的len表示驗證碼的位數,算術驗證碼的text()表示的是公式的結果, 對於算術驗證碼,你應該把公式的結果存儲session,而不是公式。

驗證碼字符類型

類型 描述
TYPE_DEFAULT 數字和字母混合
TYPE_ONLY_NUMBER 純數字
TYPE_ONLY_CHAR 純字母
TYPE_ONLY_UPPER 純大寫字母
TYPE_ONLY_LOWER 純小寫字母
TYPE_NUM_AND_UPPER 數字和大寫字母

使用方法:

SpecCaptcha captcha = new SpecCaptcha(130, 48, 5);
captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);

只有SpecCaptchaGifCaptcha設置才有效果。

字體設置

內置字體.png

使用方法:

 

SpecCaptcha captcha = new SpecCaptcha(130, 48, 5);

// 設置內置字體
captcha.setFont(Captcha.FONT_1); 

// 設置系統字體
captcha.setFont(new Font("楷體", Font.PLAIN, 28)); 

出base64編碼

SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
specCaptcha.toBase64();

// 如果不想要base64的頭部data:image/png;base64,
specCaptcha.toBase64("");  // 加一個空的參數即可

輸出到文件

FileOutputStream outputStream = new FileOutputStream(new File("C:/captcha.png"))
SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
specCaptcha.out(outputStream);

前后端分離項目的使用

前后端分離項目建議不要存儲在session中,存儲在redis中,redis存儲需要一個key,key一同返回給前端用於驗證輸入

@Controller
public class CaptchaController {
    @Autowired
    private RedisUtil redisUtil;
    
    @ResponseBody
    @RequestMapping("/captcha")
    public JsonResult captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
        SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
        String verCode = specCaptcha.text().toLowerCase();
        String key = UUID.randomUUID().toString();
        // 存入redis並設置過期時間為30分鍾
        redisUtil.setEx(key, verCode, 30, TimeUnit.MINUTES);
        // 將key和base64返回給前端
        return JsonResult.ok().put("key", key).put("image", specCaptcha.toBase64());
    }
    
    @ResponseBody
    @PostMapping("/login")
    public JsonResult login(String username,String password,String verCode,String verKey){
        // 獲取redis中的驗證碼
        String redisCode = redisUtil.get(verKey);
        // 判斷驗證碼
        if (verCode==null || !redisCode.equals(verCode.trim().toLowerCase())) {
            return JsonResult.error("驗證碼不正確");
        }
    }  
}

自定義效果

繼承Captcha實現out方法,中文驗證碼可繼承ChineseCaptchaAbstract,算術驗證碼可繼承ArithmeticCaptchaAbstract


免責聲明!

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



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