Как правильно пропустить reCAPTCHA через фильтр FilterChain?

Ссылка скопирована
14 февраля 2026 1 ответ

Приветствую уважаемые форумчане.

У меня такая задача.

Механизм проверки reCAPTCHA я пропускаю через фильтр FilterChain и если возникает false, то происходит redirect обратно на туже страницу “/login”. Вот как мне правильно сообщить контроллеру “/login” о том, что клиент не прошёл проверку CAPTCHA?

package com.test;  import org.springframework.stereotype.Component; import org.springframework.web.filter.GenericFilterBean;  import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;  @Component public class Test extends GenericFilterBean {      @Override     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {           HttpServletRequest httpServletRequest = (HttpServletRequest) request;         HttpServletResponse httpServletResponse = (HttpServletResponse) response;             httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login");              chain.doFilter(request, response);      }  }

package com.test; import org.springframework.stereotype.Component; import org.springframework.web.filter.GenericFilterBean; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class Test extends GenericFilterBean { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServletResponse = (HttpServletResponse) response; httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login"); chain.doFilter(request, response); } }

Или может я вообще неправильно, что-то делаю?

.

Дополнительно:

Не знаю поможет ли вам, но вот, тут есть информация по интеграции reCaptcha в Spring
https://www.baeldung.com/spring-security-registrat...

  • azerphoenix, Нет, это не то Видел я это.
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Максим Павлов Ответ

    Для того чтобы пропустить reCAPTCHA через фильтр FilterChain, вам необходимо выполнить следующие шаги:

    1. Создайте экземпляр класса FilterChain и добавьте в него все фильтры, которые должны обрабатывать запросы.

    $chain = new FilterChain();
    $chain->addFilter(new CaptchaFilter());
    $chain->addFilter(new AuthenticationFilter());

    $chain = new FilterChain(); $chain->addFilter(new CaptchaFilter()); $chain->addFilter(new AuthenticationFilter());

    2. Создайте класс CaptchaFilter, который будет проверять reCAPTCHA. В этом классе вы можете использовать библиотеку для работы с reCAPTCHA, например, Google reCAPTCHA PHP.

    class CaptchaFilter {
        public function doFilter($request, $response, $chain) {
            // Проверка reCAPTCHA
            $recaptcha = new \ReCaptcha\ReCaptcha($secretKey);
            $resp = $recaptcha->verify($request->getParam('g-recaptcha-response'), $request->getIp());
     
            if ($resp->isSuccess()) {
                // reCAPTCHA пройдена успешно
                $chain->doFilter($request, $response);
            } else {
                // Ошибка валидации reCAPTCHA
                $response->setStatusCode(403);
                $response->setContent('reCAPTCHA validation failed');
            }
        }
    }

    class CaptchaFilter { public function doFilter($request, $response, $chain) { // Проверка reCAPTCHA $recaptcha = new \ReCaptcha\ReCaptcha($secretKey); $resp = $recaptcha->verify($request->getParam('g-recaptcha-response'), $request->getIp()); if ($resp->isSuccess()) { // reCAPTCHA пройдена успешно $chain->doFilter($request, $response); } else { // Ошибка валидации reCAPTCHA $response->setStatusCode(403); $response->setContent('reCAPTCHA validation failed'); } } }

    3. Добавьте класс AuthenticationFilter, который будет проверять аутентификацию пользователя.

    class AuthenticationFilter {
        public function doFilter($request, $response, $chain) {
            // Проверка аутентификации пользователя
            if ($request->getUser()->isLoggedIn()) {
                $chain->doFilter($request, $response);
            } else {
                // Пользователь не аутентифицирован
                $response->setStatusCode(401);
                $response->setContent('Unauthorized access');
            }
        }
    }

    class AuthenticationFilter { public function doFilter($request, $response, $chain) { // Проверка аутентификации пользователя if ($request->getUser()->isLoggedIn()) { $chain->doFilter($request, $response); } else { // Пользователь не аутентифицирован $response->setStatusCode(401); $response->setContent('Unauthorized access'); } } }

    4. Запустите цепочку фильтров для обработки запроса.

    $chain->doFilter($request, $response);

    $chain->doFilter($request, $response);

    Теперь у вас должен быть рабочий механизм обработки reCAPTCHA через FilterChain. Не забудьте настроить все необходимые параметры, такие как секретный ключ для reCAPTCHA и логику аутентификации пользователя.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно