2009-12-07 6 views
0

J'ai l'obligation de lancer une page jsf à partir d'un client léger personnalisé dans le navigateur de l'utilisateur (le client léger envoie un message http). Comme la page jsf peut être invoquée plusieurs fois, j'utilise un jsp pour rediriger vers la page jsf avec params sur url. En jsp je fais une invalidation de session. Le code jsp est ci-dessous:Utilisation de Post lors d'un envoi de redirection

<!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> 

Ma page JSF utilise tomber mutiple vers le bas avec des articles autosubmit activé. Je définis les paramètres sur la session lorsque le formulaire est initialisé puis l'utilise à partir de là lorsqu'un bouton d'action est finalement cliqué par l'utilisateur. Voici le code que j'utilise pour obtenir le constructeur dans param backing bean 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"); 

De cette façon, je peux obtenir le même après plusieurs param autoSubmits de menus déroulants.

Mon problème est que je ne peux pas avoir de paramètres apparaissent sur la barre d'adresse du navigateur. J'ai besoin d'un moyen pour que les paramètres puissent être transmis à la page jsp. Je ne peux pas publier directement sur jsp à partir du client léger, car j'ai besoin de la page jsf pour avoir une nouvelle session chaque fois que le client lance le navigateur de l'utilisateur. Ceci est dû à l'extrait de code ci-dessus sur la façon dont j'utilise les paramètres dans la page jsf.

Y a-t-il moyen d'utiliser un post lors d'un sendRedirect pour ne pas avoir à passer de params sur url? Je ne peux pas utiliser forward car lorsqu'un autoSubmit se déclenche sur une page jsf, le navigateur actualise la page jsp à la place.

Existe-t-il une meilleure façon de gérer la page jsf elle-même afin que je ne doive pas compter sur le stockage des paramètres sur la session entre les événements autoSubmit successifs?

Répondre

1

Puisque vous invalidez la session, non, vous ne pouvez pas.

Le seul moyen serait de le mettre dans la portée de la session. Pourquoi êtes-vous en train d'invalider la session à la première demande? Cela n'a vraiment aucun sens.

Non lié à votre problème réel, faire sendRedirect() dans un scriptlet au lieu d'un Filter et avoir un tas de HTML dans la même page JSP est reçu pour de gros problèmes. N'écrivez pas de code Java brut dans les fichiers JSP, vous ne voulez pas l'avoir. Le code Java appartient aux classes Java. Utilisez taglibs/EL dans JSP uniquement.

1

Non. Parce que sendRedirect envoie au navigateur Web/client un 302 avec le nouvel emplacement et selon ce qui suit, il s'agira généralement d'un GET, quelle que soit la requête d'origine.

Selon 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. 

Peut-être jouer avec soin ajax pouvez-vous obtenir quelque chose. Mise à jour

: Là encore, en tant qu'utilisateur: BalusC a souligné, vous pouvez rediriger en réglant manuellement les en-têtes, comme dans: « Puis-je rediriger une requête POST »

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

Pour ceux qui interprète la question , alors la réponse serait "Oui, vous pouvez utiliser une redirection 307". – BalusC

+0

D'accord. Mais autant que je sache, vous ne pouvez pas faire un 307 avec la méthode JSP sendRedirect(). – xgMz

+1

Non, la valeur par défaut est 302. Vous pouvez toutefois définir vous-même l'état de la réponse et l'en-tête. Voir aussi http://stackoverflow.com/questions/4836858/is-response-redirect-always-an-http-get-response/4837351#4837351 – BalusC

Questions connexes