Перенаправляет ли RequestDispatcher метод HTTP исходного запроса? - PullRequest
14 голосов
/ 21 декабря 2009

Я хочу перехватить запрос, используя RequestDispatcher, а затем я хочу переслать запрос вместе с другим сервлетом - что-то вроде этого:

RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/some.ThirdPartyServlet" + "?" + "param_name=" + "somevalue");
dispatcher.forward(request, response);

Если входящий запрос был POST, примет ли диспетчер запросов мои новые параметры и включит их в тело сообщения, или это переадресация теперь станет GET?

Ответы [ 3 ]

15 голосов
/ 21 декабря 2009

Я думаю, что ваша проблема скорее связана с доступностью переданного запроса параметров (не атрибутов, как упоминают другие). В этом случае не имеет значения, используете ли вы переадресацию или перенаправление. Но если вы используете переадресацию на другой Servlet, то будет вызван соответствующий метод, связанный с начальным запросом, полученным с помощью HttpServletRequest#getMethod(). Если это POST, то будет вызвано doPost(). Вы все еще можете получить доступ к дополнительным параметрам в строке запроса обычным способом: HttpServletRequest.getParameter().

Так что в сервлете 1, в основном, следующее:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    request.getRequestDispatcher("servlet2?foo=bar").forward(request, response);
}

в основном может быть обработан сервлетом 2 следующим образом:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    String foo = request.getParameter("foo"); // Returns "bar".
}
15 голосов
/ 21 декабря 2009

Сохраняет исходный запрос, не меняя его.

Итак, он останется POST, если он был POST.

7 голосов
/ 21 декабря 2009

Если вы используете forward, тогда управление остается в контейнере сервлета, атрибуты запроса сохраняются, а запрос остается POST. Когда вы используете перенаправление, это вызывает отправку ответа в браузер, заставляя его выполнить запрос GET, в котором он теряет атрибуты запроса для исходного запроса, поскольку GET является совершенно новым запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...