Использование Post при выполнении sendRedirect - PullRequest
0 голосов
/ 07 декабря 2009

У меня есть требование, что страница jsf должна быть запущена из пользовательского тонкого клиента в браузере пользователя (тонкий клиент делает http-пост). Поскольку страница jsf может вызываться несколько раз, я использую jsp для перенаправления на страницу jsf с параметрами в URL. В jsp я делаю сессию недействительной. Код JSP ниже:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page session="true" %>

<%
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
session.invalidate();

String outcome = request.getParameter("outcome");


String queryString = "outcome=" + outcome ;

response.sendRedirect("./faces/MyPage.jspx?"  + queryString);


%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></meta>
    <title>title here</title>
  </head>
  <body></body>
</html>

Моя страница jsf использует несколько выпадающих элементов с включенной автоматической отправкой. Я устанавливаю параметры для сеанса, когда форма сначала создается, а затем использую его оттуда, когда пользователь нажимает на кнопку действия. Ниже приведен код, который я использую для получения параметра в конструкторе бина jsf:

FacesContext ctx = getFacesContext();
Map sessionState = ctx.getExternalContext().getSessionMap();
outcome = (String)sessionState.get("outcome");
if(outcome == null)  //if not on session, get from url
    outcome = (String)JSFUtils.getManagedBeanValue("param.outcome");

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

Моя проблема в том, что я не могу отобразить параметры в адресной строке браузера. Мне нужен способ, чтобы параметры можно было передать на страницу JSP. Я не могу публиковать прямые сообщения в jsp с тонкого клиента, так как мне нужна страница jsf для нового сеанса каждый раз, когда клиент запускает браузер пользователя. Это связано с приведенным выше фрагментом кода о том, как я использую params на странице jsf.

Есть ли способ использовать сообщение при выполнении sendRedirect, чтобы мне не приходилось передавать параметры в URL? Я не могу использовать пересылку, поскольку при автоматической загрузке на странице jsf браузер обновляет страницу jsp.

Есть ли лучший способ обработать саму страницу jsf, чтобы мне не приходилось полагаться на сохранение параметров в сеансе между последовательными событиями autoSubmit?

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Нет. Поскольку sendRedirect отправляет веб-браузеру / клиенту 302 с новым местоположением и в соответствии с нижеследующим обычно это GET, независимо от того, каким был исходный запрос.

Согласно HTTP / 1.1 RFC 2616 http://www.ietf.org/rfc/rfc2616.txt:

If the 302 status code is received in response to a request other
than GET or HEAD, **the user agent MUST NOT automatically redirect the
request unless it can be confirmed by the user**, since this might
change the conditions under which the request was issued.

Note: RFC 1945 and RFC 2068 specify that the client is not allowed
to change the method on the redirected request.  However, ***most
existing user agent implementations treat 302 as if it were a 303
response, performing a GET on the Location field-value regardless
of the original request method***. The status codes 303 and 307 have
been added for servers that wish to make unambiguously clear which
kind of reaction is expected of the client.

Может быть, осторожная игра с ajax может вам что-то дать.

Обновление: опять же, как указал пользователь: BalusC , вы можете перенаправить, вручную установив заголовки, как в:

response.setStatus(307);
response.setHeader("Location", "http://google.com");
1 голос
/ 07 декабря 2009

Поскольку вы лишаете законной силы сеанс, нет, вы не можете.

Единственным способом было бы поместить его в область видимости сеанса. Почему вы, кстати, аннулируете сеанс по первому запросу? Это не имеет никакого смысла.

Вне зависимости от вашей реальной проблемы, выполнение sendRedirect() в скриптлете вместо Filter и наличие группы HTML на одной и той же странице JSP - это большая проблема. Не пишите сырой код Java в файлах JSP, вы не хотите иметь это. Java-код принадлежит классам Java. Используйте taglibs / EL только в JSP.

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