これについてはすでにたくさんの質問があることは知っていますが、それでも決定的な答えは見つからなかったようです。私が探しているのは、ユーザーがたとえば2週間ログインした後、またはログアウトするまで、ユーザーを記憶させることです。以下は私が起こるべきだと思うことであり、もう少し経験のある人が私が正しいか間違っているかを教えてくれるだろうかと思っていました。
ユーザーが初めてログインします。サーバーへのRPC呼び出しは、新しいsessionIDを含む'UserInfo'オブジェクトを返します。サーバー上で別名これが発生し、user
返されます:
user.setSessionId(getThreadLocalRequest().getSession().getId());
が返された後user
、クライアント側のデータを保存するためにCookieを作成する必要があります。現在のユーザーとsessionIDの別のユーザーを識別するためにCookieが必要であると言っているのは正しいですか?
final long DURATION = 1000 * 60 * 60 * 24 * 14; //duration remembering login - 2 weeks
Date expires = new Date(System.currentTimeMillis() + DURATION);
String sessionID = user.getSessionId();
String username = user.getUsername();
Cookies.setCookie("sessionID", sessionID, expires, null, "/", false);
Cookies.setCookie("username", username, expires, null, "/", false);
これで、ユーザーが後日アプリに戻ったときにCookieを確認し、(ユーザーからの明示的なログアウトなどの理由でCookieが存在し、削除されていない場合)、その値を使用してRPCを介してセッションの有効性を確認します。サーバー:
String sessionID = Cookies.getCookie("sessionID");
String username = Cookies.getCookie("username");
if ( sessionID != null && username != null){
AsyncCallback<UserInfo> callBack = new AsyncCallback<UserInfo>(){
@Override
public void onFailure(Throwable caught) {
Window.alert("Error connecting to server.");
}
@Override
public void onSuccess(Boolean sessionValid) {
if (sessionValid)
loadInitialInterfaceForUser("username");
else
loadLoginInterface();
}
};
loginSvc.checkSessionValidity(sessionID,username, callBack);
}
else
loadLoginInterface();
さて、これまでに行ったことが正しいと仮定すると(これは少し長いショットです:P)、私の本当の質問は、サーバー側で正確に何をチェックする必要があるかということcheckSessionValidity(sessionID,username)
です。
サーバーサイドに保存したユーザーを取得して、ユーザーに関連付けたユーザーと比較するだけの場合 sessionID
ですか?sessionID
有効期限が切れていないことも確認しますか?
私はこれが長らく、おそらくあまりよく言葉にされていない質問であることを知っています...私は頭を回すのに苦労しているので、どんな助けでも大歓迎です!
乾杯、スティーブ