2009-07-16 4 views
12

Tôi chỉ cần enabled Session trong ứng dụng Google AppEngine/Java + GWT của mình. Và làm thế nào để sử dụng nó? Làm thế nào để nhận được ID phiên và chơi sẽ tất cả các công cụ tốt từ nó? Có bất kỳ ví dụ thực sự của trang đăng nhập đơn giản, nơi tôi chỉ cần nhập LoginName và mật khẩu, sau đó nó đi đến máy chủ qua cuộc gọi RPC, xác thực đối với cơ sở dữ liệu và gửi ID phiên trở lại cho khách hàng.Ví dụ về phiên Google AppEngine

Tôi đã mã sau đây đã được nhưng không biết phải làm gì tiếp theo:

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

Bất kỳ gợi ý đi đúng hướng Sẽ hữu ích. Cảm ơn.

+1

Hãy cẩn thận nếu bạn chỉ sử dụng một cookie dựa sessionId để xác thực, vì nó có thể để lại cho bạn mở các cuộc tấn công kịch bản qua trang web: http://groups.google.com/group/Google-Web-Toolkit/web/security-for-gwt-applications –

Trả lời

16

Đây là cách bạn có thể nhận được phiên GAE:

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

Cảm ơn, đây là những gì tôi cần. – Maksim

+2

Nhưng bạn vẫn có thể sử dụng request.getSession() trong ngữ cảnh servlet mặc dù đúng không? – HaveAGuess

+1

getThreadLocalRequest() là cách GWT để truy cập vào yêu cầu được chuyển vào dịch vụ và vào doGet, doPut, vv ... Vì tôi thường không sử dụng GWT, tôi dựa trên request.getSession(). Hoạt động tốt. – Chuck

18

Bật hỗ trợ phiên cung cấp cho bạn một Servlet HttpSession chuẩn.

Điều này sẽ được theo dõi bằng một cookie (được gọi là JSESSONID), được quản lý bởi thùng chứa servlet bên dưới nắp. Bạn không cần quan tâm đến id phiên.

Sau đó, bạn có thể đặt thuộc tính (phía máy chủ) sẽ được liên kết với phiên (để bạn có thể truy xuất chúng sau này).

HttpServletRequest request = this.getThreadLocalRequest(); 

HttpSession session = request.getSession(); 

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

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

Điều này cũng sẽ hoạt động với các yêu cầu Ajax từ GWT. Vui lòng tham khảo bất kỳ hướng dẫn nào của Servlet để biết thêm chi tiết.

Hạn chế của phiên trên GAE (so với các công cụ servlet khác) là chúng được tuần tự hóa và nạp vào cơ sở dữ liệu mỗi lần, có thể tốn kém, đặc biệt nếu bạn đặt nhiều dữ liệu trong đó.

+9

chúng được ghi nhớ mặc dù. – Schildmeijer