Вопрос о поведении сервлета Java - PullRequest
1 голос
/ 30 июля 2010

В настоящее время я внедряю проверяющую сторону OpenID (RP) и провайдера идентификации (IdP) с Java HttpServlets с использованием библиотеки OpenID4Java. Я столкнулся с проблемой, заставляя двух сервлетов общаться друг с другом. Я считаю, что проблема, с которой я сталкиваюсь, заключается в том, чтобы больше понимать, как ведут себя сервлеты, однако я включил информацию о своем приложении, чтобы лучше понять, что происходит.

Сценарий выглядит следующим образом:

Сервлет № 1 (мой RP) отправляет запрос сервлету № 2 (мой IdP) следующим образом:

httpResp.sendRedirect(authReq.getDestinationUrl(true));

По сути, authReq = сообщение с различными параметрами OpenID. Вызывая getDestinationUrl (true), он кодирует запрос в URL для отправки через GET.

Servlet # 2 перехватывает вышеуказанный GET в методе doGet. Он анализирует информацию и создает ответ для отправки сервлету № 1 следующим образом:

String responseText = processRequest (httpReq, httpResp);

        httpResp.setContentType("text/html");
        OutputStream outputStream = httpResp.getOutputStream();
        //
        outputStream.write(responseText.getBytes());
        outputStream.close();

Моя проблема в том, что этот ответ никогда не возвращается к сервлету №1. Я ожидаю, что когда Сервер № 1 получит ответ от Сервлета № 2, его метод doGet или doPost перехватит сообщение. Однако ни один случай не происходит.

Любой совет будет принят с благодарностью.

Спасибо!

Ответы [ 3 ]

1 голос
/ 30 июля 2010

Ответ 2-го сервлета напрямую пойдет на сторону клиента, я думаю, потому что это оригинальный клиент, верно?Ваш первый сервлет просто перенаправляет запрос.

Итак, если вы хотите установить связь между сервлетами, используйте URLConnection или Apache HttpClient для связи со вторым сервлетом.

Вы также можете сделать JSPвместо 2-го сервлета передайте данные из 1-го сервлета в этот JSP.Тогда ответ JSP будет отправлен клиенту.В конце концов, вы можете выполнять всю логику в JSP, как в сервлете.

Надеюсь, это поможет.

parth.

0 голосов
/ 30 июля 2010

Вы можете использовать RequestDispatcher, чтобы включить ответ вашего второго сервлета. Таким образом, элемент управления возвращается к первому сервлету после завершения метода.

RequestDispatcher dispatcher = request.getRequestDispatcher(authReq.getDestinationUrl(true));
dispatcher.include(request, response);

Однако при этом ответ, сгенерированный вызываемым сервлетом, будет отправлен в браузер. Если вы хотите, чтобы вызывающий сервлет захватывал сообщение от вызываемого сервлета без отправки в браузер, вы можете либо создать оболочку ответа (оболочку, записывающую содержимое в строку), и передать эту оболочку, когда вы включаете второй сервлет, или, что еще лучше, вы можете поделиться данные в любой из областей (предпочтительно «область запроса»): вы можете установить данные в области запроса в вызываемом сервлете и получить их в вызывающем сервлете после завершения include ().

Когда вы перенаправляете, вы говорите браузеру сделать новый запрос для URL. Таким образом, будут созданы новые объекты запроса / ответа, как если бы вы щелкнули ссылку на своей странице.

Надеюсь, это поможет.

0 голосов
/ 30 июля 2010

Если вы хотите, чтобы два сервлета взаимодействовали друг с другом в приложении, вы можете использовать объект ServletContext и обмениваться данными через ServletContext.setAttribut e и ServletContext.getAttribute и RequestDispatcher, полученный через HttServletRequest или ServletContext

В вашем случае Servlet # 2 может быть вызван непосредственно клиентом?Если нет, то вам, вероятно, следует преобразовать processRequest (запрос, ответ) в класс Utility или библиотеку.Который, в свою очередь, может быть вызван сервлетом № 1 и сервлетом № 2.

response.sendRedirect отправляет перенаправление (301 перемещено, ithink) в браузер.Таким образом, ваш сервлет фактически отправляет ответ браузеру с 301, а затем браузер снова делает запрос сервлету № 2.

...