2009-07-16 17 views
12

J'ai juste enabled Session dans mon application Google AppEngine/Java + GWT. Et comment l'utiliser? Comment est-ce que j'obtiens l'ID de session et le jeu tout sera-t-il bon? Existe-t-il de véritables exemples de page de connexion simple où je ne fais que saisir LoginName et Password, puis passer au serveur via un appel RPC, s'authentifier auprès de la base de données et renvoyer l'ID de session au client.Exemple de session AppEngine Google

je code suivant déjà, mais ne sais pas quoi faire:

GWT Login Form:

public class LoginForm { 
    private final LoginServiceAsync loginService = GWT.create(LoginService.class); 

    VerticalPanel loginVp = new VerticalPanel(); 
    TextBox loginTxt = new TextBox(); 
    TextBox passTxt = new TextBox(); 

    Button loginBtn = new Button("Login"); 

    public Widget getLoginWidget(){ 

     loginBtn.addClickHandler(new ClickHandler(){ 

      public void onClick(ClickEvent arg0) { 

       loginService.authenticateUser(loginTxt.getText(), passTxt.getText(), 
         new AsyncCallback<String>(){ 

          public void onFailure(Throwable caught) { 
           InfoPanel.show(InfoPanelType.HUMANIZED_MESSAGE, "No Connetion", "Problem conneting to the server."); 
          } 

          public void onSuccess(String result) { 
           InfoPanel.show(InfoPanelType.HUMANIZED_MESSAGE, "Session ID", "Your session id is: " + result); 

           GWT.log("Setting up session", null); 
           String sessionID = result; 
           final long DURATION = 1000 * 60 * 60 * 24 * 14; //duration remembering login. 2 weeks 
           Date expires = new Date(System.currentTimeMillis() + DURATION); 
           Cookies.setCookie("sid", sessionID, expires, null, "/", false); 
          } 
         } 
       ); 
      } 
     }); 

     loginVp.add(loginTxt); 
     loginVp.add(passTxt); 
     loginVp.add(loginBtn); 

     return loginVp; 
    } 
} 

RPC Servlet:

public class LoginServiceImpl extends RemoteServiceServlet implements LoginService{ 
    //Sends back to the client session id 
    public String authenticateUser(String login, String password){ 
     String sessionId = new String(); 

     // TODO: figure out how to work with session id in GAE/J 
     sessionId = "How to get session id?"; 

     return sessionId; 
    } 

    public Boolean checkIfSessionIsValid(String sessionId){ 

     //TODO: figure out how to check user's credentials 
     return true; 
    } 
} 

Tout conseils dans la bonne direction serait utile. Merci.

+1

Soyez prudent si vous utilisez juste un cookie à base sessionId pour l'authentification, car il peut vous laisser ouvert aux attaques de script intersite: http://groups.google.com/group/Google-Web-Toolkit/web/security-for-gwt-applications –

Répondre

16

Voici comment vous pouvez obtenir la session GAE:

this.getThreadLocalRequest().getSession(); 
+0

Merci, c'est ce dont j'ai besoin. – Maksim

+2

Mais il est toujours possible d'utiliser request.getSession() dans un contexte de servlet, bien que ce soit correct? – HaveAGuess

+1

getThreadLocalRequest() est le moyen GWT d'accéder à la requête qui est passée en service et dans doGet, doPut, etc ... Comme je n'utilise généralement pas GWT, je me base sur request.getSession(). Fonctionne bien. – Chuck

18

L'activation de la prise en charge des sessions vous permet d'obtenir une session HttpSession standard.

Ceci sera suivi au moyen d'un cookie (appelé JSESSONID), qui est géré par le conteneur de servlet sous les couvertures. Vous n'avez pas besoin de vous soucier de l'identifiant de la session.

Vous pouvez ensuite définir les attributs (côté serveur) qui seront associés à la session (afin de pouvoir les récupérer plus tard).

HttpServletRequest request = this.getThreadLocalRequest(); 

HttpSession session = request.getSession(); 

// in your authentication method 
if(isCorrectPassword) 
    session.setAttribute("authenticatedUserName", "name"); 

// later 
if (session.getAttribute("authenticatedUserName") != null) 

Cela devrait également fonctionner avec les requêtes Ajax de GWT. Veuillez vous référer à n'importe quel didacticiel Servlet pour plus de détails. L'inconvénient des sessions sur GAE (par rapport aux autres moteurs de servlets) est qu'elles sont sérialisées et chargées à partir de la base de données à chaque fois, ce qui peut être coûteux, surtout si vous y mettez beaucoup de données.

+9

ils sont cependant mémorisés. – Schildmeijer

Questions connexes