Пример Google AppEngine Session - PullRequest
       6

Пример Google AppEngine Session

12 голосов
/ 16 июля 2009

Я просто включил сеанс в своем приложении Google AppEngine / Java + GWT. И как мне это использовать? Как мне получить сессионный ID и играть с ним все хорошо? Существуют ли реальные примеры простой страницы входа, где я просто ввожу имя_пользователя и пароль, затем она отправляется на сервер через вызов RPC, проверяет подлинность в базе данных и отправляет идентификатор сеанса обратно клиенту.

У меня уже есть следующий код, но я не знаю, что делать дальше:

GWT Форма входа:

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-сервлет:

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

Любые подсказки в правильном направлении были бы полезны. Спасибо.

Ответы [ 2 ]

18 голосов
/ 16 июля 2009

Включение поддержки сеансов дает вам стандартный сервлет HttpSession.

Это будет отслеживаться с помощью файла cookie (называемого JSESSONID), который управляется контейнером сервлета под крышками. Вам не нужно заботиться об идентификаторе сеанса.

Затем вы можете установить атрибуты (на стороне сервера), которые будут связаны с сеансом (чтобы вы могли получить их позже).

HttpServletRequest request = this.getThreadLocalRequest();

HttpSession session = request.getSession();

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

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

Это также должно работать с Ajax-запросами от GWT. Пожалуйста, обратитесь к любому руководству по сервлету для получения более подробной информации.

Недостаток сеансов в GAE (по сравнению с другими механизмами сервлетов) заключается в том, что они сериализуются и загружаются из базы данных каждый раз, что может быть дорогостоящим, особенно если вы помещаете туда много данных.

16 голосов
/ 16 июля 2009

Вот как вы можете получить сеанс в GAE:

this.getThreadLocalRequest().getSession();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...