Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2363 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JSP/SERVLET] Sauvegarder une requête pour l'exécuter apres login...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JSP/SERVLET] Sauvegarder une requête pour l'exécuter apres login...

n°910071
maphi
Monde de merde
Posté le 29-11-2004 à 11:00:43  profilanswer
 

Bonjour tlm,
 
J'ai un bug que je ne m'explike pas, fo dire que je débute avec les jsp...
Je bosse sur une appli web qui demande une authentification (réalisée sur la page login.jsp). J'aimerai que l'utilisateur puisse entrer directement une url quelconque du site et pas seulement la page d'acceuil.  
Par exemple, j'aimerai qu'il puisse taper au choix  
http://localhost:8080/MyApp/Home.jsp
http://localhost:8080/MyApp/MyPage.do?id=1
 
Dans les deux cas, si l'utilisateur n'est pas loggé, il va être redirigé vers la page login.jsp, qui va se charger se l'authentification puis de rediriger vers la page saisie au début.
 
La requête initiale est donc sauvegarder dans un objet qui hérite de HttpServletRequestWrapper :

Code :
  1. request.getSession().setAttribute("savedRequest", new SavedHttpServletRequest(request));


Lorsque j'exécute ça, je sauvegarde les paramtres, les attributs, l'uri et le contextPath de la requete dans des variables membres de SavedHttpServletRequest.
 
Je réalise donc l'authentification puis je reexecute la fameuse page :

Code :
  1. Object obj = request.getSession().getAttribute("savedRequest" );
  2. SavedHttpServletRequest savedRequest= (SavedHttpServletRequest) obj;
  3. // j'ai simplifie ici, je recupere l'uri relative dans mon prog
  4. String savedUri = savedRequest.getRequestURI();
  5. // appelle super.setRequest puis ajoute les attr/params/uri/context de la nouvelle requete
  6. saveRequest.setRequest(request);
  7. RequestDispatcher rd = request.getRequestDispatcher(uri);
  8. rd.forward(savedRequest, response);


 
Voila en gros ce que le prog fait.
Le pb, c'est que tout ca fonctionne tres bien sous tomcat, mais plante lamentablement sous websphere. Avec un null pointer exception lors de l'exécution du forward.
 
Je précise que ce n'est pas moi qui ai écrit l'appli (j'ai dit que je débutait hein :-) et que donc, je ne sais pas si cette méthode est la bonne... vous en pensez quoi ?


Message édité par maphi le 29-11-2004 à 11:03:29
mood
Publicité
Posté le 29-11-2004 à 11:00:43  profilanswer
 

n°910078
benou
Posté le 29-11-2004 à 11:05:58  profilanswer
 

en toute logique, même si c'est un peu tordu, ca devrait fonctionner ... tu peux filer la stacktrace entre le forward et le moment ou ca crache le nullpointer ?

n°910097
maphi
Monde de merde
Posté le 29-11-2004 à 11:18:10  profilanswer
 

Pour les traces, c un peu délicat, je te file les premieres lignes...
 
Je te file l'erreur dans le std_err:

Code :
  1. java.lang.ClassCastException: com.app.servlet.SavedHttpServletRequest
  2. at com.ibm.servlet.engine.webapp.HttpServletRequestProxy.getSRTSessionAPISupport(HttpServletRequestProxy.java:278)
  3. at com.ibm.servlet.engine.webapp.HttpServletRequestProxy.getSession(HttpServletRequestProxy.java:102)
  4. at com.ibm.servlet.engine.webapp.HttpServletRequestProxy.getSession(HttpServletRequestProxy.java:106)
  5. at org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:134)
  6. at org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:115)
  7. at jsp._home_jsp_0._jspService(_home_jsp_0.java:70)


 
et dans le sdt_out :

Code :
  1. X Servlet Error: : java.lang.NullPointerException
  2. at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:126)
  3. at jsp._home_jsp_0._jspService(_home_jsp_0.java:285)


 
Tu dis que la méthode est tordue... pourquoi donc ? Et si tu as une méthode plus simple, je suis preneur...

n°910141
maphi
Monde de merde
Posté le 29-11-2004 à 11:48:55  profilanswer
 

J'ai trouve ca, apparement, c la meme technique ki est utilisee, mais ca va pas assez loin ...
 
http://forum.java.sun.com/thread.j [...] ID=1344316
 

n°910369
maphi
Monde de merde
Posté le 29-11-2004 à 16:00:45  profilanswer
 

Bon, prenons le pb sous un autre angle...
 
Est ce ke qqn peut m'expliker (ou me filer un lien) comment fonctionne le forward ?
 
En gros j'ai pigé qu'on peut faire :

Code :
  1. RequestDispatcher rd = request.getRequestDispatcher("/myPage.jsp" );
  2. rd.forward(request, response);


 
Mais comment ca se se passe si le jsp cible attends des paramètres/attributs ? Ca ne semble pas fonctionner si je les colle en parametres du getRequestDispatcher. Donc, je suis censé les mettre ou ? Et la request qu'on passe en paramètre du forward, y a t'il des contraintes particulières dessus ?


Message édité par maphi le 29-11-2004 à 16:15:41
n°910739
benou
Posté le 29-11-2004 à 22:07:23  profilanswer
 

maphi a écrit :

Pour les traces, c un peu délicat, je te file les premieres lignes...
 
Je te file l'erreur dans le std_err:

Code :
  1. java.lang.ClassCastException: com.app.servlet.SavedHttpServletRequest
  2. at com.ibm.servlet.engine.webapp.HttpServletRequestProxy.getSRTSessionAPISupport(HttpServletRequestProxy.java:278)
  3. at com.ibm.servlet.engine.webapp.HttpServletRequestProxy.getSession(HttpServletRequestProxy.java:102)
  4. at com.ibm.servlet.engine.webapp.HttpServletRequestProxy.getSession(HttpServletRequestProxy.java:106)
  5. at org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:134)
  6. at org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:115)
  7. at jsp._home_jsp_0._jspService(_home_jsp_0.java:70)




ouais ben voilà, websphere fait un cast à l'arrache en un de ses objets interne => ClassCastException.
Donc la seule solution c'est que tu lui files la request que t'as reçu en paramêtre : tu peux pas l'encapsuler.
 
Visiblement, la seule chose dont tu te sers dans la request que tu as sauvegardé c'est le requestURI, donc plutot que de sauvegarder le request en entier, sauvegarde juste la requestURI ...


---------------
ma vie, mon oeuvre - HomePlayer
n°910758
benou
Posté le 29-11-2004 à 22:12:07  profilanswer
 

maphi a écrit :

Mais comment ca se se passe si le jsp cible attends des paramètres/attributs ? Ca ne semble pas fonctionner si je les colle en parametres du getRequestDispatcher. Donc, je suis censé les mettre ou ? Et la request qu'on passe en paramètre du forward, y a t'il des contraintes particulières dessus ?


sisi : si tu mets des attributs dans la request avant le forward, tu vas les retrouver dans la jsp vers laquelle tu forwards.
 
et pour les pramètres ca arche aussi : c'est dans les specs du servlet 2.3 que les paramètres passées dans un getRequestDispatcher (sous le format /cible.jsp?param=value) doivent se retrouver en faisant un request.getPramater() dans la servlet cible.


---------------
ma vie, mon oeuvre - HomePlayer
n°911011
maphi
Monde de merde
Posté le 30-11-2004 à 08:38:37  profilanswer
 

Citation :

sisi : si tu mets des attributs dans la request avant le forward, tu vas les retrouver dans la jsp vers laquelle tu forwards.
 
et pour les pramètres ca arche aussi : c'est dans les specs du servlet 2.3 que les paramètres passées dans un getRequestDispatcher (sous le format /cible.jsp?param=value) doivent se retrouver en faisant un request.getPramater() dans la servlet cible.


 
Tu as entierement raison. Il fo obligatoirement passer les parametres directement dans le getRequestDispatcher. Lors du traitement de la jsp, tomcat recupere les parametres par un getParameterMap, websphere, non.
Ce qui explike que ca fonctionnait juska present sous tomcat et pas sous websphere.
Etonant kan meme k'on ne puisse pas simplement faire des setParameter de la meme maniere kon fait un setAttribute et ke la recuperation desdits parametres ne passe pas forcement par l'interface. Car c'est dit dans les specs aussi...
 

Citation :

The request and response parameters must be either the same objects as were passed to the calling servlet's service method or be subclasses of the ServletRequestWrapper or ServletResponseWrapper classes that wrap them.


 
Bref, je vais passer les parametres a la main, ca marche sous websphere ET tomcat, c'est juste un peu moins propre au nivo du code.
 
Merci en tout cas. :jap:
 
PS : tu as un lien sur les specs "du servlet 2.3" ou c'est precise ke l'on doit passé les params via l'url ?


Message édité par maphi le 30-11-2004 à 08:45:40
n°911034
benou
Posté le 30-11-2004 à 09:34:08  profilanswer
 

maphi a écrit :


Tu as entierement raison. Il fo obligatoirement passer les parametres directement dans le getRequestDispatcher. Lors du traitement de la jsp, tomcat recupere les parametres par un getParameterMap, websphere, non.


c'est quelle version de WebSphere que tu utilses ? parce que c'est une une spécification de Tomcat ca, c'est une specification de la norme Servlet 2.3. Si Websphere se dit conforme à cette norme (inclue dans J2EE 1.3), il doit s'y conformer !
 
 

maphi a écrit :


Etonant kan meme k'on ne puisse pas simplement faire des setParameter de la meme maniere kon fait un setAttribute et ke la recuperation desdits parametres ne passe pas forcement par l'interface.  


c'est logque qu'il n'y ait pas un setParameter : l'objet request représente la requête HTTP, elle n'est pas modifiable [:spamafote]
 
Mais vraiment, j'ai l'impression que tu utilises un vieux websphere ... j'avais eu exactement le même problème en utilisant une ancienne version de JRun (servlet2.1),  
 

maphi a écrit :


Merci en tout cas. :jap:
 
PS : tu as un lien sur les specs "du servlet 2.3" ou c'est precise ke l'on doit passé les params via l'url ?


http://www.jcp.org/aboutJava/commu [...] al/jsr053/
page 56 : SRV.8.1.1


---------------
ma vie, mon oeuvre - HomePlayer
n°911046
maphi
Monde de merde
Posté le 30-11-2004 à 10:04:14  profilanswer
 

Ha ben oui, c la version 4.0.3 ... qui est pas compatible servlet 2.3.
Ceci explikant cela.
 
Re merci, on aura au moins trouvé le fin mot de l'histoire :d


Message édité par maphi le 30-11-2004 à 10:04:47
mood
Publicité
Posté le 30-11-2004 à 10:04:14  profilanswer
 

n°911064
benou
Posté le 30-11-2004 à 10:35:13  profilanswer
 

[:benou_jap]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JSP/SERVLET] Sauvegarder une requête pour l'exécuter apres login...

 

Sujets relatifs
executer du code au chargement d'une formRequete sql sur plusieurs tables avec nom de la table
executer un programme sur le serveurAider moi pour une requete
Requête spéciale[MYSQL] Requete multi base de données
[MYSQL]requete selective distinganteComment executer une requete SQL avec VB6 ?
Rêquete imbriqué avec MySQL 
Plus de sujets relatifs à : [JSP/SERVLET] Sauvegarder une requête pour l'exécuter apres login...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR