1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zlay0701-EasyCaptcha

Клонировать/Скачать
README.md 14 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 07.06.2025 11:38 7e72243

EasyCaptcha

MavenCentral Hex.pm

1. Введение

 Java-графический CAPTCHA, поддерживающий GIF, китайский текст, арифметические выражения и другие типы. Может использоваться в проектах Java Web, JavaSE и т.д.


2. Примеры

CAPTCHA    CAPTCHA    CAPTCHA
CAPTCHA    CAPTCHA    CAPTCHA

Арифметический тип:

CAPTCHA    CAPTCHA    CAPTCHA

Китайский текст:

CAPTCHA    CAPTCHA    CAPTCHA

Встроенные шрифты:

CAPTCHA    CAPTCHA    CAPTCHA


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Для включения 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.

4.2. Использование сервлета

Конфигурация сервлета в 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" />

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);  // Очистка капчи из сессии
            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 предоставляет функции для вывода капчи, хранения в сессии и проверки корректности капчи. Можно также не использовать этот вспомогательный класс.

```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("Код на проверку неверен");
        }
    }
}

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);  // Количество цифр в выражении, по умолчанию 2
        captcha.getArithmeticString();  // Получить строку арифметического выражения: 3+2=?
        captcha.text();  // Получить результат выражения: 5
        
        captcha.out(outputStream);  // Вывести капчу
    }
}

Примечание:
 Длина арифметической капчи указывает количество цифр в выражении, а для других типов капчи — количество символов. Метод text() для арифметической капчи возвращает результат выражения, а не само выражение. Для арифметической капчи результат выражения следует сохранить в сессии, а не само выражение.

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 | ![](https://s2.ax1x.com/2019/08/23/msMe6U.png)
 Captcha.FONT_2 | ![](https://s2.ax1x.com/2019/08/23/msMAf0.png)
 Captcha.FONT_3 | ![](https://s2.ax1x.com/2019/08/23/msMCwj.png)
 Captcha.FONT_4 | ![](https://s2.ax1x.com/2019/08/23/msM9mQ.png)
 Captcha.FONT_5 | ![](https://s2.ax1x.com/2019/08/23/msKz6S.png)
 Captcha.FONT_6 | ![](https://s2.ax1x.com/2019/08/23/msKxl8.png)
 Captcha.FONT_7 | ![](https://s2.ax1x.com/2019/08/23/msMPTs.png)
 Captcha.FONT_8 | ![](https://s2.ax1x.com/2019/08/23/msMmXF.png)
 Captcha.FONT_9 | ![](https://s2.ax1x.com/2019/08/23/msMVpV.png)
 Captcha.FONT_10 | ![](https://s2.ax1x.com/2019/08/23/msMZlT.png)

## 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. Пользовательские эффекты

&emsp;Наследуйте `Captcha` для реализации метода `out`. Для китайских капч вы можете наследовать `ChineseCaptchaAbstract`, а для арифметических капч — `ArithmeticCaptchaAbstract`.

---

## 8. Журнал обновлений

- **23 августа 2019 (v1.6.2)**
    - Добавлены 10 красивых встроенных шрифтов, не зависящих от системных шрифтов
    
    - Добавлены арифметические капчи, количество знаков операции можно настроить
    - Добавлена возможность вывода base64-кодирования
    - Добавлены кривые Безье как линии помех

- **9 августа 2018 (v1.5.0)**
    - Добавлены настройки для чисто больших букв, чисто малых букв, цифр и больших букв
    
    - Добавлены китайские капчи и китайские gif-капчи
    - Добавлены эффекты против шума, улучшены цвета текста
    - Добавлен `CaptchaUtil` для удобства использования в веб-проектах

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/zlay0701-EasyCaptcha.git
git@api.gitlife.ru:oschina-mirror/zlay0701-EasyCaptcha.git
oschina-mirror
zlay0701-EasyCaptcha
zlay0701-EasyCaptcha
master