Как перенаправить запрос на URI, переданный в заголовках с помощью Jetty AsyncProxyServlet - PullRequest
0 голосов
/ 28 сентября 2018

Я создаю прокси-микро-сервис с SpringBoot, Jetty и kotlin.

Цель этого микро-сервиса - перенаправлять запросы, сделанные моим клиентским приложением, на внешние сервисы (избегая CORS)и отправьте ответ после проверки некоторой пользовательской аутентификации.Запрос, который я получу, будет содержать URL-адрес цели в заголовках (то есть: Target-Url: http://domain.api/getmodel).

На основе этого ответа я создал класс, который расширяет AsyncProxyServletи переписал метод sendProxyRequest:

class ProxyServlet : AsyncProxyServlet() {

    private companion object {
        const val TARGET_URL = "Target-Url"
    }

    override fun sendProxyRequest(clientRequest: HttpServletRequest, proxyResponse: HttpServletResponse, proxyRequest: Request) {
        // authentication logic

        val targetUrl = clientRequest.getHeader(TARGET_URL)

        if (authSuccess) {
            super.sendProxyRequest(clientRequest, proxyResponse, proxyRequest)
        } else {
            proxyResponse.status = HttpStatus.UNAUTHORIZED.value()
        }
    }

}

Когда я запрашиваю свой прокси-сервер, я использую этот метод и успешно аутентифицируюсь, но не понимаю, как использовать targetUrl для перенаправления запроса.

Метод продолжает вызывать себя, так как перенаправляет исходный запрос к себе (запрос от http://myproxy:port/ до http://myproxy:port/).

Очень трудно найти документацию по этой конкретной реализации пристани,StackOverflow - мое последнее средство!

1 Ответ

0 голосов
/ 01 октября 2018

Сначала настройте ведение журнала для Jetty и настройте ведение журнала уровня DEBUG для пространства имен пакета org.eclipse.jetty.proxy, это поможет вам лучше понять поведение.

Параметр Request proxyRequest представляет объект HttpClient/Request, который создается с неизменным назначением URI / URL (это связано с различными другими функциями, требующими информации из URI / URL, такими как пул подключений, файлы cookie, аутентификация и т. д.), вы не можете изменить URI / URL для этого объекта послена самом деле вы должны создать объект HttpClient/Request с правильным URI / URL.

Поскольку все, что вы хотите сделать, это изменить целевой URL, вы должны вместо этого переопределить метод ...

protected String rewriteTarget(HttpServletRequest clientRequest)

... и возвращение новой абсолютной строки URI в место назначения, которое вы хотите использовать (заголовок "Target-Url" в вашем сценарии выглядит хорошим кандидатом)

Вы можете увидеть эту логику вкодовый блок ProxyServlet.service(HttpServletRequest, HttpServletResponse) (который начинается с AsyncProxyServlet)

...