Probleme de forward dans une servlet - Java - Programmation
Marsh Posté le 25-02-2004 à 12:48:10
alors déjà c'est pas une redirection mais un forward
ensuite, comme te dis l'exception, ton outputstream etait fermé.
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 |
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
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
Marsh Posté le 25-02-2004 à 14:06:53
tu inclus une servlet dans un jsp
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?
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 ? |
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
Si tu fais un forward il ne faut pas que tu écrives dans la réponse avant ...
edit : ni après d'ailleur ...
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 ?
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
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
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 |
Ok je regarde ça
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
(genre <if user has permission>blablabla</if...> )
benou, si t'as une autre technique pour faire ça je suis preneur
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à zou, redirect !"
Si t'as pas le droit d'accéder à la jsp, faut même pas arriver dessus ...
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é?
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
Marsh Posté le 25-02-2004 à 15:48:09
tout à fait, je ne parlais que pour moi
(et bien sur j'ai un filtre en amont pour l'accès global aux servlets/actions/...)
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 |
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.
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)
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.
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...
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.
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 ...
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
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 |
Autre question et après je vous laisse tranquille ...
Peut-on mettre ces droits automatiquement sur les jsp lors du deploiement avec un .war ?
Marsh Posté le 25-02-2004 à 16:50:19
ReplyMarsh 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
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
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 :
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 ;
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