Ответ 1
Вот как вы можете получить сеанс в GAE:
this.getThreadLocalRequest().getSession();
Я просто включил сеанс в приложении Google AppEngine/Java + GWT. И как его использовать? Как получить идентификатор сеанса и играть в него все будет хорошо? Существуют ли какие-либо реальные примеры простой страницы входа, где я просто вводя LoginName и пароль, затем он переходит на сервер по вызову 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;
}
}
Servlet 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 credentials
return true;
}
}
Любые подсказки в правильном направлении были бы полезны. Спасибо.
Вот как вы можете получить сеанс в GAE:
this.getThreadLocalRequest().getSession();
Включение поддержки сеанса дает стандартный сервлет 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. Дополнительную информацию см. В любом учебнике Servlet.
Недостаток сеансов на GAE (по сравнению с другими сервлетами) заключается в том, что они каждый раз сериализуются и загружаются из базы данных, что может быть дорогостоящим, особенно если вы размещаете там много данных.