2009-12-07 2 views
0

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

<!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 использует Mutiple выпадающие элементы с включенным AutoSubmit. Я устанавливаю параметры на сеансе, когда форма сначала вводится, а затем использует ее оттуда, когда пользовательская кнопка нажата. Ниже код я использую, чтобы получить из параметров в 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"); 

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

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

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

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

ответ

1

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

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

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

1

Нет. Поскольку 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 вы можете получить что-то.

Update: Затем снова, как пользователь: BalusC указал, вы можете перенаправить, установив вручную заголовки, как: «Могу ли я перенаправить запрос POST»

response.setStatus(307); 
response.setHeader("Location", "http://google.com"); 
+0

Для тех, кто интерпретирует вопрос , тогда ответ будет «Да, вы можете, используйте перенаправление 307». – BalusC

+0

Согласовано. Но насколько я знаю, вы не можете сделать 307 с помощью метода JSP sendRedirect(). – xgMz

+1

Нет, он по умолчанию равен 302. Однако вы можете просто установить статус ответа и заголовок самостоятельно. См. Также http://stackoverflow.com/questions/4836858/is-response-redirect-always-an-http-get-response/4837351#4837351 – BalusC

Смежные вопросы