Probleme de forward dans une servlet

Probleme de forward dans une servlet - Java - Programmation

Marsh Posté le 25-02-2004 à 12:30:56    

Voilà j'ai fais une servlet avec une forward.
ça fonctionne mais ça me sort une erreur en sortie de Tomcat :
 

Citation :

StandardWrapperValve[jsp]: "Servlet.service()" pour la servlet jsp a généré une exception
org.apache.jasper.JasperException: Stream closed
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:254)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
 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)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:594)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392)
 at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)
 at java.lang.Thread.run(Thread.java:536)
----- Root Cause -----
java.io.IOException: Stream closed
 at org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:239)
 at org.apache.jasper.runtime.JspWriterImpl.clearBuffer(JspWriterImpl.java:194)
 at org.apache.jsp.index_jsp._jspService(index_jsp.java:104)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:210)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
 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)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:594)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392)
 at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)
 at java.lang.Thread.run(Thread.java:536)


 
Voici le code où je fais ma redirection ;
 

Citation :

 if ((resultat.equals("accesdenied" ))||(resultat.equals("finsession" ))){
   RequestDispatcher rd = this.getServletContext().getRequestDispatcher(url);
   rd.forward(request,response);
  }


Message édité par Mazda3 le 25-02-2004 à 14:21:21
Reply

Marsh Posté le 25-02-2004 à 12:30:56   

Reply

Marsh Posté le 25-02-2004 à 12:48:10    

alors déjà c'est pas une redirection mais un forward :o
 
ensuite, comme te dis l'exception, ton outputstream etait fermé.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 13:57:43    

the real moins moins a écrit :

alors déjà c'est pas une redirection mais un forward :o
 
ensuite, comme te dis l'exception, ton outputstream etait fermé.


 
forward et redirection, ce n'est pas pareil ?
 
...
 
Ah ça y est je crois voir la difference :
le forward donne la main à une autre servlet alors que la redirection, redirige la page.
 
Mais dans aucun moment dans mon code je ne ferme mon outpustream.
 
Au debut de la servlet je fais ceci:  
 
PrintWriter out = response.getWriter();
 
et après j'y touche plus

Reply

Marsh Posté le 25-02-2004 à 14:04:11    

Peut vient-il du fait que cette servlet je l'"include" dans ma jsp ?
 
<jsp:include page="/servlet/maServlet"/>
 
Et que ça ferme mon outPutStream

Reply

Marsh Posté le 25-02-2004 à 14:06:53    

tu inclus une servlet dans un jsp [:autobot]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 14:07:34    

je sais pas, j'ai jamais fait ça, et je le ferai jamais. cela dit ça devrait marcher, mais ptet qu'en effet il fait des cochonneries avec le writer...
 
benou?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 14:07:53    

mazda3 a écrit :

Peut vient-il du fait que cette servlet je l'"include" dans ma jsp ?
 
<jsp:include page="/servlet/maServlet"/>
 
Et que ça ferme mon outPutStream


attend, tu ne dois pas faire de include si c'est pour forwarder la requête après, ca n'a pas de sens ...
 
L'erreur doit venir de là, mais j'aurais plutot vu un IllegalStateException ... à moins que tu fasse le include après le forward [:gratgrat]
 
 
Si tu fais un forward il ne faut pas que tu écrives dans la réponse avant ...
edit : ni après d'ailleur ...


Message édité par benou le 25-02-2004 à 14:11:11

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-02-2004 à 14:19:12    

Ok donc ça doit venir de là.
 
Je ne sais pas si cela soit propre "codement parlant".
 
Mais comment faire ?
 
J'ai une servlet qui teste (au début de la jsp) si l'utilisateur connecté a droit de regarder cette page, si c'est pas le cas il le renvoi sur une page comme quoi il n'a pas le droit.
 
Vous avez une méthode plus simple ?


Message édité par Mazda3 le 25-02-2004 à 14:19:47
Reply

Marsh Posté le 25-02-2004 à 14:22:29    

Et quand je le renvoi avec un response.sendRedirect("accesrefuse.jsp" ), il ne fait pas la redirection

Reply

Marsh Posté le 25-02-2004 à 14:26:43    

utilise un filtre pour faire les vérification qui doivent se faire en amont
 
http://java.sun.com/products/servl [...] ilter.html
 
 
http://java.sun.com/products/servlet/Filters.html


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-02-2004 à 14:26:43   

Reply

Marsh Posté le 25-02-2004 à 14:27:45    

benou a écrit :

utilise un filtre pour faire les vérification qui doivent se faire en amont
 
http://java.sun.com/products/servl [...] ilter.html
 
 
http://java.sun.com/products/servlet/Filters.html
 


 
Ok je regarde ça

Reply

Marsh Posté le 25-02-2004 à 14:34:09    

sinon perso j'avais une taglib qui le faisait dans une page pour afficher conditionnelement certaines infos :whistle:
(genre <if user has permission>blablabla</if...> )
benou, si t'as une autre technique pour faire ça je suis preneur


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 15:17:09    

nop j'ai pas.
 
La meilleur méthode reste le filtre selon moi. ou à la rigueur un module d'autorisation appelée au sein des servlets, mais je trouve qu'une fois qu'on est dans la jsp "finale" c'est plus le moment de se dire "ha ben non, tiens, j'ai pas le droit d'être là  :whistle:  zou, redirect !"
 
Si t'as pas le droit d'accéder à la jsp, faut même pas arriver dessus ...


Message édité par benou le 25-02-2004 à 15:17:28

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-02-2004 à 15:27:04    

oui oui mais ce dont je parle ça serait une jsp (un "ecran" ) ou certaines infos ne seraient visibles que par l'admin par exemple
(exemple concret les boutons "delete post", "ban user", ... d'un forum; tu vas pas faire deux jsp identiques avec seulement ça en plus dans un cas)
 
moi je vois deux solutions: avoir un tag qui va verifier ça au moment de l'affichage, ou bien la servlet qui sette un booleen ou autre dans la request, booleen utilisé par la jsp pour afficher ou non, donc bon je prefere le tag à ce moment là.. autre possibilité?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 15:46:17    

dans ce genre de cas, un tag c'est bien ...
 
Mais notre amis c'est pas vraiment ca son besoin puisque dans le cas où il est pas autorisé il fait une redirection alors que toi, si j'ai bien compris, tout le monde aurait droit d'accès mais avec plus ou moins d'options affichées


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-02-2004 à 15:48:09    

tout à fait, je ne parlais que pour moi :D
 
(et bien sur j'ai un filtre en amont pour l'accès global aux servlets/actions/...)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 15:49:37    

the real moins moins a écrit :

oui oui mais ce dont je parle ça serait une jsp (un "ecran" ) ou certaines infos ne seraient visibles que par l'admin par exemple
(exemple concret les boutons "delete post", "ban user", ... d'un forum; tu vas pas faire deux jsp identiques avec seulement ça en plus dans un cas)
 
moi je vois deux solutions: avoir un tag qui va verifier ça au moment de l'affichage, ou bien la servlet qui sette un booleen ou autre dans la request, booleen utilisé par la jsp pour afficher ou non, donc bon je prefere le tag à ce moment là.. autre possibilité?

Tiens moi dans ce cas-là j'aurais préféré la deuxième solution ; la jsp elle affiche ce qu'on lui dit d'afficher, à mon sens c'est pas à elle de décider ce qui doit être affiché ou non.... enfin bon ça revient au même à la fin, hein.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 25-02-2004 à 15:53:15    

oui d'accord mais ça revient au meme: le contenu est qd meme dans la jsp: la seule difference c'est la manière dont la décision est prise. en dans la 1ere solution, c'est encapsulé dans un tag jsp. ça permet aussi d'alléger la logique dans la servlet. (et de ne modifier que la jsp si on veut changer ce comportement - mais là je suis moins sur qu'il s'agisse d'un avantage)


Message édité par the real moins moins le 25-02-2004 à 15:53:39

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 15:55:13    

the real moins moins a écrit :

oui d'accord mais ça revient au meme: le contenu est qd meme dans la jsp: la seule difference c'est la manière dont la décision est prise. en dans la 1ere solution, c'est encapsulé dans un tag jsp. ça permet aussi d'alléger la logique dans la servlet. (et de ne modifier que la jsp si on veut changer ce comportement - mais là je suis moins sur qu'il s'agisse d'un avantage)

Ouais t'as sans doute raison.. j'ai pas trop l'habitude de travailler avec des tags (enfin j'ai pas trop l'habitude de travailler avec des jsp tout court), donc j'ai pas le réflexe, mais c'est sans doute une solution plus élégante.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 25-02-2004 à 16:03:04    

à vrai dire, je ne sais pas. il y a encore un tas de gens qui conchie les jsp et prefere des template engines style velocity, mais je me demande comment ils font ce genre de choses...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 16:21:44    

Tiens vous savez comment faire pour qu'on ne puisse modifier les jsp ?
 
Avec des droits, mot de passe, ou autres ...
Il y a que le serveur qui peut les executer.


Message édité par Mazda3 le 25-02-2004 à 16:22:40
Reply

Marsh Posté le 25-02-2004 à 16:26:21    

ca c'est un problème de droit d'accès aux fichiers ... t'as qu'à autoriser la modif des jsp que par un utilisateur ...
 
si t'es sous windows il te faut une partition NTFS ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-02-2004 à 16:37:27    

à vrai dire aucun user ne devrait pouvoir les modifier, et total safety: seul tomcat ou autre pour les lire :D
 


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 16:38:47    

Ok ! Merci !

Reply

Marsh Posté le 25-02-2004 à 16:43:41    

the real moins moins a écrit :

à vrai dire aucun user ne devrait pouvoir les modifier, et total safety: seul tomcat ou autre pour les lire :D
 
 


 
Autre question et après je vous laisse tranquille ...  :)  
 
Peut-on mettre ces droits automatiquement sur les jsp lors du deploiement avec un .war ?


Message édité par Mazda3 le 25-02-2004 à 16:44:02
Reply

Marsh Posté le 25-02-2004 à 16:50:19    

non c'est pas possible :/


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-02-2004 à 17:43:39    

c'est os-dependent
 
par contre tu peux configurer ton systeme pour que webapps ait des sticky bits machins qui feront que tout fichier créé dedans aura tel ou tel droits


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-02-2004 à 17:44:32    

tfaçons, je vois pas pq qqun aurait le droit d'aller là dedans autrement qu'en lecture donc bon.. tu fous le rep tomcat ou webapps en rwxrx-rx- et s'il appartient à l'user tomcat c bon


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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