Текущий проект -- это веб-сервер с автогенерирующейся валидацией CAPTCHA.
Чтобы собрать проект, напишите следующее в вашем терминале:
$ cd captcha-server
$ mvn package
Это сгенерирует jar файл в target
директории.
$ java -jar -Dproduction=[true/false] server.jar <ttl>
-Dproduction=[true/false]
-- режим работы сервера. Если он равенfalse
, тогда сервер будет отдавать ответ на CAPTCHA после генерации, и наоборот.ttl
is a time limit in seconds for an answer.
Таким образом, обычный запуск выглядит следующим образом:
$ mvn package && java -jar -Dproduction=false target/captcha-server-0.0.1-SNAPSHOT.jar 10
После исполнения команды, идите на localhost:8080/client/register
, чтобы зарегистрировать клиента.
Сервер написан с использованием фреймворка Spring.
После того как реквест придёт на веб сервер, он передаёт его в нужный контроллер, который затем передаёт реквест в необхдимый обработчик реквестов: ClientRequestHandler
или CaptchaRequestHandler
.
Разделение хендлеров на CAPTCHA и клиентов даёт удобный интерфейс для расширения функциональности обработки реквестов как для CAPTCHA, так и для клиентов.
У CaptchaRequestHandler
есть мап соответствий между клиентом, запросившим капчу и самой капчой. Соответственно, при принятии ответа от клиента, капча удаляется из памяти -- это даёт невозможность ответить два раза на одну и ту же капчу.
Реализована фабрика для создания капча и клиентов: CaptchaFactory
и ClientFactory
, обе расширяют AbstractFactory
, имея возможность создавать объекты и удалять их.
Выделена абстракция генерации картинок (Image
объектов) -- AbstractImageGenerator
. Эта абстракция позволяет легко добавлять различные генераторы картинок: текстовые, картинки облаков, картинки животных и т.д., необходимо только реализовать методы drawImage
и generateImage
. После генерации текстовой картинки для капчи, к ней применяется фильтр, который добавляет шум для усложнения прочтения.
Таким образом, когда приходит запрос на генерацию капчи, с помощью фабрики генерируется сама капча, поддерживается соответствие клиента и капчи на уровне обработчика реквестов. Сама же картинка для капчи генерируется TextImageGenerator
, который генерирует картинки с рандомными надписями на них. После этого применяется шум и картинка сохраняется в классе Captcha
.