2013-02-18 6 views
0

J'ai une application Web Java déployée sur 2 machines hôtes, avec un filtre de servlet. J'envoyé une requête POST à ​​l'application sur un hôte, qui est intercepté par le filtre et redirigé vers l'autre hôte:Comment préserver le corps de la demande lors de l'exécution de la redirection HTTP à partir du filtre de servlet

public void doFilter (ServletRequest request, ServletResponse response, 
     FilterChain filterChain) 
{ 
    ... 
    if(shouldRedirect) { 
     httpResponse.sendRedirect(redirectLocation); 
    } 
} 

Sur la seconde machine, la requête passe par le filtre et est géré par une API REST dans une classe de ressources. L'objet stream est envoyé dans le cadre du corps de la requête POST. Après la redirection, le corps de la demande n'est pas envoyé et stream est vide. Comment puis-je préserver le corps de la requête (ou au moins cette partie) après la redirection?

Merci. Re-visite le navigateur de l'utilisateur et à partir du navigateur rend une visite à l'URL re-dirigé.

Répondre

2

J'exécuterait un poste au redirectLocation à la place. sendRedirect indique au client de modifier son emplacement afin que vous démarriez une nouvelle requête HTTP à ce stade.

Lorsque vous effectuez la redirection, le client peut lancer la demande POST d'origine vers la nouvelle URL.

2

sendRedirect() Cela dit, les données POST ne sont disponibles qu'à l'hôte initial où le first request a été reçu. c'est-à-dire filtre dans ce cas.

Qu'est-ce que vous pouvez faire:

modifier votre URL de redirection pour inclure des données POST comme Request Parameters in GET url

par exemple host2\servlet?param=one&param2=two

En savoir plus sur URL Redirection

5

Une autre méthode que j'ai trouvé pourrait fonctionner est un 307 (redirection temporaire). Cela préserve le corps de la requête d'origine, donc cela fonctionne dans ce cas. La redirection 307 a des implications en matière de sécurité telles que détaillées here, mais il y a l'avantage de ne pas avoir l'hôte d'origine agissant comme un proxy pour une requête HTTP bloquante.

public void doFilter(...) 
{ 
    ... 
    httpResponse.setStatus(TEMPORARY_REDIRECT); 
    httpResponse.setHeader("Location", redirectLocation); 
    return; 
} 
+0

Merci, cela a vraiment résolu mon problème comme un charme. – Madwyn

+0

thx, ceci est une excellente réponse, a travaillé pour ma demande qui avait aussi un corps avec des données – osmingo

Questions connexes