簡介
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);
只有SpecCaptcha和GifCaptcha設置才有效果。
字體設置
內置字體.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。
