2009-07-16 20 views
12

Ho appena enabled Session nella mia applicazione Google AppEngine/Java + GWT. E come lo uso? Come posso ottenere l'ID della sessione e riprodurre tutte le cose buone da esso? Ci sono esempi reali di semplice pagina di login in cui sto solo inserendo LoginName e Password, poi va al server su chiamata RPC, si autentica contro il database e restituisce l'ID di sessione al client.Esempio di sessione Google AppEngine

Ho seguente codice già, ma non so che cosa fare dopo:

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; 
    } 
} 

Eventuali suggerimenti nella giusta direzione sarebbe utile Grazie.

+1

stare attenti se si sta usando solo un cookie sessionId base per l'autenticazione, come si può lasciare aperta a croce attacchi di scripting del sito: http://groups.google.com/group/Google-Web-Toolkit/web/security-for-gwt-applications –

risposta

16

Ecco come è possibile ottenere la sessione in GAE:

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

Grazie, questo è quello di cui ho bisogno. – Maksim

+2

Ma va ancora bene usare request.getSession() anche in un contesto di servlet, giusto? – HaveAGuess

+1

getThreadLocalRequest() è il modo GWT di ottenere l'accesso alla richiesta che è passata in servizio e in doGet, doPut, ecc ... Poiché generalmente non utilizzo GWT, mi affido a request.getSession(). Funziona bene. – Chuck

18

L'abilitazione del supporto di sessione fornisce una HttpSession standard per Servlet.

Questo verrà tracciato tramite un cookie (denominato JSESSONID), gestito dal contenitore servlet sotto le coperture. Non è necessario preoccuparsi dell'ID di sessione.

È quindi possibile impostare gli attributi (lato server) che verranno associati alla sessione (in modo che sia possibile recuperarli in un secondo momento).

HttpServletRequest request = this.getThreadLocalRequest(); 

HttpSession session = request.getSession(); 

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

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

Questo dovrebbe funzionare anche con richieste Ajax da GWT. Fare riferimento a qualsiasi esercitazione Servlet per ulteriori dettagli.

Lo svantaggio delle sessioni su GAE (rispetto ad altri motori servlet) è che vengono serializzate e caricate dal database ogni volta, il che potrebbe essere costoso, soprattutto se si inseriscono molti dati.

+9

però sono memcached. – Schildmeijer

Problemi correlati