Java 驗證碼生成工具 EasyCaptcha


Java 驗證碼生成工具 EasyCaptcha

 

 

 

1.簡介

 Java圖形驗證碼,支持gif、中文、算術等類型,可用於Java Web、JavaSE等項目。
gitee: (https://gitee.com/ele-admin/EasyCaptcha)、(https://gitee.com/organizations/dw-project/projects)


2.效果展示

驗證碼驗證碼驗證碼

驗證碼驗證碼驗證碼

算術類型:

驗證碼驗證碼驗證碼

中文類型:

驗證碼驗證碼驗證碼

內置字體:

驗證碼驗證碼驗證碼


3.導入項目

3.1.gradle方式的引入

dependencies {
    compile 'com.github.whvcse:easy-captcha:1.6.2'
}

3.2.maven方式引入

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

3.3.jar包下載

easy-captcha-1.6.2.jar

maven導入jar包,在項目根目錄創建libs文件夾,然后pom.xml添加如下:

<dependency>
  <groupId>com.github.whvcse</groupId>
  <artifactId>easy-captcha</artifactId>
  <version>1.6.1</version>
  <systemPath>${basedir}/libs/easy-captcha-1.6.2.jar</systemPath>
</dependency>

4.使用方法

4.1.在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" />

不要忘了把/captcha路徑排除登錄攔截,比如shiro的攔截。

4.2.在servlet中使用

web.xml中配置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" />

4.3.判斷驗證碼是否正確

@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("驗證碼不正確");
        }
    }   
}

4.4.設置寬高和位數

@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);
    }
}

4.5.不使用工具類

 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("驗證碼不正確");
        }
    }  
}

5.更多設置

5.1.驗證碼類型

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,而不是公式。

5.2.驗證碼字符類型

類型 描述
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設置才有效果。

5.3.字體設置

內置字體:

字體 效果
Captcha.FONT_1
Captcha.FONT_2
Captcha.FONT_3
Captcha.FONT_4
Captcha.FONT_5
Captcha.FONT_6
Captcha.FONT_7
Captcha.FONT_8
Captcha.FONT_9
Captcha.FONT_10

使用方法:

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

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

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

5.4.輸出base64編碼

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

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

5.5.輸出到文件

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

6.前后端分離項目的使用

 前后端分離項目建議不要存儲在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("驗證碼不正確");
        }
    }  
}

前端使用ajax獲取驗證碼:

<img id="verImg" width="130px" height="48px"/>

<script>
    var verKey;
    // 獲取驗證碼
    $.get('/captcha', function(res) {
        verKey = res.key;
        $('#verImg').attr('src', res.image);
    },'json');
    
    // 登錄
    $.post('/login', {
        verKey: verKey,
        verCode: '8u6h',
        username: 'admin',
        password: 'admin'
    }, function(res) {
        console.log(res);
    }, 'json');
</script>

RedisUtil到這里獲取https://gitee.com/whvse/RedisUtil


7.自定義效果

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


8.更新日志

  • 2019-08-23 (v1.6.2)

    • 增加10種漂亮的內置字體,不依賴系統字體

    • 增加算術驗證碼,運算位數可自由配置

    • 增加輸出base64編碼的功能

    • 增加貝塞爾曲線作為干擾線

  • 2018-08-09 (v1.5.0)

    • 增加純大寫字母、純小寫字母、數字和大寫字母配置

    • 增加中文驗證碼、中文gif驗證碼

    • 增加抗鋸齒效果,優化文字顏色

    • 增加CaptchaUtil便於Web項目使用


免責聲明!

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



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