[Tomcat] exception dans une redirection

exception dans une redirection [Tomcat] - Java - Programmation

Marsh Posté le 15-10-2002 à 10:50:53    

Bon, ben la je comprends pas trop :

Citation :


java.lang.IllegalStateException
 at org.apache.catalina.connector.HttpResponseFacade.sendRedirect(HttpResponseFacade.java:173)


 
Qu'est ce qui peut causer ce genre d'erreur ? a priori si y'avait deja du texte envoyé au client je comprendrais, mais ca semble pas être mon cas...

Reply

Marsh Posté le 15-10-2002 à 10:50:53   

Reply

Marsh Posté le 15-10-2002 à 11:03:49    

t'as du code et ce que crache les logs?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-10-2002 à 11:09:19    

DarkLord a écrit a écrit :

t'as du code et ce que crache les logs?




 
Ben le code part un peu dans tous les sens, et c'est pas moi qui l'ait ecrit, d'ou difficulté.
Ce qui jette l'exception c'est request.redirect("mapage.jsp" ).
Bon, c'est pas dramatique, vu que je peux contourner le probleme, mais j'aimerais quand même comprendre.
 
Et dans les logs j'ai juste la trace de l'exception :


2002-10-15 11:07:58 StandardWrapperValve[jwma]: Servlet.service() for servlet jwma threw exception
java.lang.IllegalStateException
 at org.apache.catalina.connector.HttpResponseFacade.sendRedirect(HttpResponseFacade.java:173)
 at jwma.webmail.JwmaSession.redirect(JwmaSession.java:231)
 at jwma.webmail.JwmaController.service(JwmaController.java:197)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)

Reply

Marsh Posté le 15-10-2002 à 11:15:14    

déjà c'est pas request, ensuite c'est pas redirect. La méthode que tu utilises est probablement sendRedirect de HttpServletResponse
 

Citation :


Sends a temporary redirect response to the client using the specified redirect location URL. This method can accept relative URLs; the servlet container must convert the relative URL to an absolute URL before sending the response to the client. If the location is relative without a leading '/' the container interprets it as relative to the current request URI. If the location is relative with a leading '/' the container interprets it as relative to the servlet container root.  
If the response has already been committed, this method throws an IllegalStateException. After using this method, the response should be considered to be committed and should not be written to.


 
ca aide?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-10-2002 à 11:19:44    

DarkLord a écrit a écrit :

déjà c'est pas request, ensuite c'est pas redirect. La méthode que tu utilises est probablement sendRedirect de HttpServletResponse




Ouais, ca doit être ca. En fait je passe par des objets intermédiaire, d'ou racontage de n'importe quoi.
 

Citation :


If the response has already been committed, this method throws an IllegalStateException. After using this method, the response should be considered to be committed and should not be written to.
 
ca aide?


Ben ca confirme ce que je pensais, c'est a dire que la réponse a déja été envoyée au client avant. Je vois pas ou je fais ca dans mon code, mais si c'est la seule explication, ben faut que je regarde mieux.
 
Merci.

Reply

Marsh Posté le 15-10-2002 à 11:26:17    

sinon balance le corps de ton doGet/doPost pour voir ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-10-2002 à 11:27:54    

DarkLord a écrit a écrit :

sinon balance le corps de ton doGet/doPost pour voir ...




euh, nan, je t'assure que tu ne veux pas le voir :D
mais alors vraiment pas. Parfois j'ai un peu honte  :o

Reply

Marsh Posté le 15-10-2002 à 11:29:09    

comme tu veux ..
 
 :hello:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 16-10-2002 à 01:34:09    

lorill a écrit a écrit :

 
euh, nan, je t'assure que tu ne veux pas le voir :D
mais alors vraiment pas. Parfois j'ai un peu honte  :o  



quoted
ça peut tjs servir :o


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 16-10-2002 à 09:08:04    

un truc tout con aussi : oublie pas de mettre un return après chaque sendRedirect parce que sinon L'execution de la servlet continue
 
ex :

Code :
  1. if (testeDErreur) {
  2.    response.sendRedirect("/error" );
  3. }
  4. out.println("ok" );


 
dans le cas de l'erreur, le send redirect va être envoyé, mais l'execution va continuer et la servlet va écrire le ok ce qui va provoquer une erreur d'état.
 
il faut donc faire ca :  
 

Code :
  1. if (testeDErreur) {
  2.    response.sendRedirect("/error" );
  3.    return;
  4. }
  5. out.println("ok" );


Message édité par benou le 16-10-2002 à 09:28:48
Reply

Marsh Posté le 16-10-2002 à 09:08:04   

Reply

Marsh Posté le 16-10-2002 à 09:13:42    

benou a écrit a écrit :

un truc totu con aussi : oublie pas de mettre un return après chaque sendRedirect parce que sinon ...




 
c'est ce que je fais dans mon code, mais la c'est un truc qui m'est tombé dessus, et c'est tout dans des if imbriqués bien moches.

Reply

Marsh Posté le 16-10-2002 à 09:14:22    

benou a écrit a écrit :

un truc totu con aussi : oublie de mettre un return après chaque sendRedirect parce que sinon L'execution de la servlet continue
 
ex :

Code :
  1. if (testeDErreur) {
  2.    response.sendRedirect("/error" );
  3. }
  4. out.println("ok" );


 
dans le cas de l'erreur, le send redirect va être envoyé, mais l'execution va continuer et la servlet va écrire le ok ce qui va provoquer une erreur d'état.
 
il faut donc faire ca :  
 

Code :
  1. if (testeDErreur) {
  2.    response.sendRedirect("/error" );
  3.    return;
  4. }
  5. out.println("ok" );


 




 
...comme après un forward, c'est ça ?

Reply

Marsh Posté le 16-10-2002 à 09:28:34    

El_Gringo a écrit a écrit :

 
...comme après un forward, c'est ça ?




ouep !

Reply

Marsh Posté le 16-10-2002 à 09:47:26    

D'ailleur c quoi la différence entre sendRedirect et un forward ?

Reply

Marsh Posté le 16-10-2002 à 09:48:31    

El_Gringo a écrit a écrit :

D'ailleur c quoi la différence entre sendRedirect et un forward ?




le forward reste entre deux servlets au sein du conteneur, et le redirect passe par http, je crois.

Reply

Marsh Posté le 16-10-2002 à 09:48:58    

lorill a écrit a écrit :

 
le forward reste entre deux servlets au sein du conteneur, et le redirect passe par http, je crois.




 
pas forcément une servlet ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 16-10-2002 à 09:53:00    

...j'vois pas trop dans quel cas utiliser l'un ou l'autre !
Jusqu'a maintenant j'utilise que des forward...


Message édité par El_gringo le 16-10-2002 à 09:53:32
Reply

Marsh Posté le 16-10-2002 à 09:54:51    

sendRedirect correspond au code de réponse HTTP 302, c'est à dire que le contenu recherché a changé de localisation, et on indique la nouvelle localisation. Le browser fait alors une autre requête vers cette nouvelle url.
 
lors d'un dispatch, tout se passe au sein du serveur : la servlet décide de "passer la main" pour délivrer le contenu demandé (par exemple à une jsp)

Reply

Marsh Posté le 16-10-2002 à 09:57:00    

ben tu vas être emmerdé avec le forward quand tu forward vers une servlet ou une jsp qui est pas dans le même répertoire : les liens relatifs vont être niqués :(
 
le sendRedirect est vachement plus long vu qu'il y a un dialogue clien serveur supplémentaire.
 
en faite, le sendredirect est une réponse en lui même alors que le dispatch demande à quelqu'un d'autre de fournir la réponse.

Reply

Marsh Posté le 16-10-2002 à 09:57:09    

El_Gringo a écrit a écrit :

...j'vois pas trop dans quel cas utiliser l'un ou l'autre !
Jusqu'a maintenant j'utilise que des forward...




 
en complément à l'explication de benou, avec sendredirect tu forces à réinitialiser une nouvelle requete. Tandis qu'avec forward c'est interne et transparent pour le client


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 16-10-2002 à 10:00:50    

c'est tellement transparent que l'url affichée dans le browser ne change pas alors que l'ors d'un redirect, l'url du browser est modifiée et affiche la nouvelle url.

Reply

Marsh Posté le 16-10-2002 à 10:05:41    

benou a écrit a écrit :

c'est tellement transparent que l'url affichée dans le browser ne change pas alors que l'ors d'un redirect, l'url du browser est modifiée et affiche la nouvelle url.




 
En fait, un sendRedirect, c carrément plus long (comme dit benou). C ce genre de truc qui est fait quand on voit s'afficher sur un site : "une redirection va être faite" ou un truc dans l'esprit.
Mais je comprend toujours pas dans quel cas concret utiliser un sendRequest plutot qu'un forward.

Reply

Marsh Posté le 16-10-2002 à 10:08:56    

El_Gringo a écrit a écrit :

 
Mais je comprend toujours pas dans quel cas concret utiliser un sendRequest plutot qu'un forward.




 
Ben déja quand le truc vers la ou tu rediriges n'est pas sur le même serveur, t'as pas le choix.

Reply

Marsh Posté le 16-10-2002 à 10:25:06    

lorill a écrit a écrit :

 
 
Ben déja quand le truc vers la ou tu rediriges n'est pas sur le même serveur, t'as pas le choix.




 
Haaaaa, ok !
Mais quand on reste sur le même serveur, on fera toujours des forward alors.
 
Merci
 
ps : lorill, je suis pas un boulet, ça serait pas plus mal que tu me changes cette affreuse signature que tu as là ! :D

Reply

Marsh Posté le 16-10-2002 à 10:28:37    

El_Gringo a écrit a écrit :

 
ps : lorill, je suis pas un boulet, ça serait pas plus mal que tu me changes cette affreuse signature que tu as là ! :D  




 
Bon, si vraiment ca t'embete... dommage, j'aimais bien moi. Fin bon, un boulay non volontaire, c'est pas drôle. Donc voila !
 :hello:

Reply

Marsh Posté le 16-10-2002 à 10:32:22    

El_Gringo a écrit a écrit :

 
Haaaaa, ok !
Mais quand on reste sur le même serveur, on fera toujours des forward alors.  




 
mais enfin pas forcément. Pq tu t'entêtes comme ca :)  
Et puis il y a des moments (au niveau runtime) où tu ne sais absolument pas quelle est l'url (elle peut etre dans un fichier de config externe et peut etre changée par l'admin). Au départ ca sera toujours au niveau du meme serveur puis pour une raison X ou Y on va changer l'url. C'est bete de devoir changer le code de la servet et redéployer pour ca. Donc non on ne fera pas toujousr un forward.
 
Y a un cas pour tout.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 16-10-2002 à 10:54:53    

lorill a écrit a écrit :

 
 
Bon, si vraiment ca t'embete... dommage, j'aimais bien moi. Fin bon, un boulay non volontaire, c'est pas drôle. Donc voila !
 :hello:  




 
Ben, les brunocremer, rastacana, et compagnie ont un peu sali l'image que j'avait du boulet ! Me retrouver au même rang qu'eux, c même pas imaginable !

Reply

Marsh Posté le 16-10-2002 à 10:55:21    

DarkLord a écrit a écrit :

 
 
mais enfin pas forcément. Pq tu t'entêtes comme ca :)  
Et puis il y a des moments (au niveau runtime) où tu ne sais absolument pas quelle est l'url (elle peut etre dans un fichier de config externe et peut etre changée par l'admin). Au départ ca sera toujours au niveau du meme serveur puis pour une raison X ou Y on va changer l'url. C'est bete de devoir changer le code de la servet et redéployer pour ca. Donc non on ne fera pas toujousr un forward.
Y a un cas pour tout.  




 
Ouais, enfin, bref, j'ai compris maintenant !
Merci

Reply

Marsh Posté le 16-10-2002 à 11:08:57    

regarde ce brave veryfree. C'est l'exemple parfait du bon boolet.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed