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包下載
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);
只有
SpecCaptcha和GifCaptcha設置才有效果。
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項目使用
-










