2009-07-16 22 views
12

Ich bin nur enabled Session in meiner Google AppEngine/Java + GWT-Anwendung. Und wie benutze ich es? Wie bekomme ich Session-ID und spielen alle guten Sachen daraus? Gibt es echte Beispiele für einfache Login-Seite, wo ich nur LoginName und Passwort eingeben, dann geht es über RPC-Aufruf an den Server, authentifiziert sich gegen Datenbank und sendet Session ID zurück zum Client.Google AppEngine Session Beispiel

Ich habe folgenden Code schon, aber nicht wissen, was als nächstes zu tun ist: in die richtige Richtung

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

Irgendwelche Hinweise:

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 Servlets Wäre hilfreich. Danke.

+1

Seien Sie vorsichtig, wenn Sie gerade ein Cookie auf Basis sessionId für die Authentifizierung verwenden, wie es Ihnen offen für Cross-Site-Scripting-Angriffe verlassen können: http://groups.google.com/group/Google-Web-Toolkit/web/security-for-gwt-applications –

Antwort

16

Hier ist, wie Sie die Sitzung in GAE zu bekommen:

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

Danke, das ist was ich brauche. – Maksim

+2

Aber es ist immer noch in Ordnung, request.getSession() in einem Servlet-Kontext als auch richtig zu verwenden? – HaveAGuess

+1

Die getThreadLocalRequest() ist die GWT-Methode, um Zugriff auf die Anfrage zu erhalten, die in den Dienst und in doGet, doPut, etc ... übergeben wird. Da ich GWT im Allgemeinen nicht verwende, verlasse ich mich auf request.getSession(). Funktioniert gut. – Chuck

18

Das Aktivieren der Sitzungsunterstützung bietet Ihnen eine Standard-Servlet-HttpSession.

Dies wird anhand eines Cookies (JSESSONID) verfolgt, das vom Servlet-Container unter den Covern verwaltet wird. Sie müssen sich nicht um die Sitzungs-ID kümmern.

Sie können dann Attribute (serverseitig) festlegen, die der Sitzung zugeordnet werden (damit Sie sie später abrufen können).

HttpServletRequest request = this.getThreadLocalRequest(); 

HttpSession session = request.getSession(); 

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

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

Dies sollte auch mit Ajax-Anfragen von GWT funktionieren. Weitere Informationen finden Sie in jedem Servlet-Lernprogramm. Der Nachteil von Sessions auf GAE (im Vergleich zu anderen Servlet-Engines) ist, dass sie jedes Mal serialisiert und aus der Datenbank geladen werden, was sehr teuer sein kann, besonders wenn man viele Daten hineinlegt.

+9

Sie sind jedoch memcached. – Schildmeijer

Verwandte Themen