Java-графический CAPTCHA, поддерживающий GIF, китайский текст, арифметические выражения и другие типы. Может использоваться в проектах Java Web, JavaSE и т.д.
Арифметический тип:
Китайский текст:
Встроенные шрифты:
dependencies {
compile 'com.github.whvcse:easy-captcha:1.6.2'
}
<dependencies>
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
easy-captcha-1.6.2.jarДля включения jar-файла с помощью Maven, создайте папку 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
```java
@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.
Конфигурация сервлета в web.xml
:
<web-app>
<!-- Сервлет для графического капчи -->
<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); // Очистка капчи из сессии
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);
}
}
```### 4.5. Не использовать вспомогательный класс
CaptchaUtil предоставляет функции для вывода капчи, хранения в сессии и проверки корректности капчи. Можно также не использовать этот вспомогательный класс.
```java
@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);
// Выводим код на проверку в сессию
request.getSession().setAttribute("captcha", specCaptcha.text().toLowerCase());
// Выводим поток изображения
specCaptcha.out(response.getOutputStream());
}
@PostMapping("/login")
public JsonResult login(String username, String password, String verCode) {
// Получаем код на проверку из сессии
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); // Количество цифр в выражении, по умолчанию 2
captcha.getArithmeticString(); // Получить строку арифметического выражения: 3+2=?
captcha.text(); // Получить результат выражения: 5
captcha.out(outputStream); // Вывести капчу
}
}
Примечание:
Длина арифметической капчи указывает количество цифр в выражении, а для других типов капчи — количество символов. Методtext()
для арифметической капчи возвращает результат выражения, а не само выражение. Для арифметической капчи результат выражения следует сохранить в сессии, а не само выражение.
Тип | Описание |
---|---|
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 | 
## 6. Использование в проектах с разделением фронтенда и бэкенда### 6.1. Хранение капчи
Для проектов с разделением фронтенда и бэкенда не рекомендуется хранить капчу в сессиях. Вместо этого следует использовать Redis, где для каждого ключа требуется уникальный ключ, который затем передается фронтенду для проверки ввода:
```java
@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);
// Возврат ключа и 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("Неверная капча");
}
}
}
```### 6.2. Получение капчи с помощью AJAX
Фронтенд может использовать AJAX для получения капчи:
```html
<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](https://gitee.com/whvse/RedisUtil)
---
## 7. Пользовательские эффекты
 Наследуйте `Captcha` для реализации метода `out`. Для китайских капч вы можете наследовать `ChineseCaptchaAbstract`, а для арифметических капч — `ArithmeticCaptchaAbstract`.
---
## 8. Журнал обновлений
- **23 августа 2019 (v1.6.2)**
- Добавлены 10 красивых встроенных шрифтов, не зависящих от системных шрифтов
- Добавлены арифметические капчи, количество знаков операции можно настроить
- Добавлена возможность вывода base64-кодирования
- Добавлены кривые Безье как линии помех
- **9 августа 2018 (v1.5.0)**
- Добавлены настройки для чисто больших букв, чисто малых букв, цифр и больших букв
- Добавлены китайские капчи и китайские gif-капчи
- Добавлены эффекты против шума, улучшены цвета текста
- Добавлен `CaptchaUtil` для удобства использования в веб-проектах
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )