Defect #722
ログイン後にもといたページに戻りたい
0%
Description
マイページとか開いてるときにログインすると、トップページに戻ってしまう。
できればログイン後はもといたページに戻りたい。
Skillmaps.java#31
injector.getAccountService().login(GWT.getHostPageBaseURL() + Window.Location.getQueryString(),
にパラメータをつければいけるんだけど、":mypage:"とかって文字列はどうやって取得すれば良いのだろう?
Files
Updated by 啓介 大橋 almost 10 years ago
ちょっと試してはいないですけど、
確かHistory.getToken()とかでとれた気がします。
それかWindow.Navigationのメソッドであったようなぁ、、、
Updated by yusuke kokubo almost 10 years ago
- Target version changed from Sprint11.04 to Sprint11.05
Updated by yusuke kokubo almost 10 years ago
- Status changed from 新規(New) to 担当(Assigned)
- Assignee set to yusuke kokubo
試してみたらWindow.Location.getHash()でとれることはとれました。
ただ、これだとページ読み込み時にログイン後の遷移URLが固定されてしまうので、
ごちょごちょ動きまわってからログインすると意味ないです。
これちゃんとやろうと思ったら、ページ遷移するたびにログインURLを書き換えるような小細工が必要ですね…。
Window.Location.getHash()でとれることはとれるのでそんなに難しくはないのかもしれませんが
Updated by 啓介 大橋 almost 10 years ago
EventBusのaddEventでPlaceChangeEvent,PlaceEventHandler.Handlerを登録すれば、
Historyが変わるタイミングを拾えますよー
それかHistoryのaddValueChangeHandlerでも行けるはずです。
いまHeaderはdiコンテナで管理してないので実装はHistoryの方が簡単ですが、
思想的にはHeaderをDIコンテナ管理にしてeventBusをinjectionするか、
headerのpresenterをつくってそこでイベント登録するべきかもですね。
Updated by yusuke kokubo almost 10 years ago
History#addValueChangeHandler試してみました。
これでできそうな感じがしたのでしたがダメでした。
なぜか選択したPlaceの一個前のやつがとれてきてるみたいです。
書く場所がおかしい…?
public void onModuleLoad() { Resources.INSTANCE.style().ensureInjected(); final Injector injector = GWT.create(Injector.class); injector.getActivityManager(); RootPanel.get("loader").setVisible(false); RootPanel.get("header").add(new Header(null)); ContentsPanel contentsPanel = injector.getContentsPanel(); contentsPanel.init(); RootPanel.get("contents").add(contentsPanel); RootPanel.get("footer").add(new Footer()); injector.getAccountService().login(GWT.getHostPageBaseURL() + Window.Location.getQueryString() + Window.Location.getHash(), new AsyncCallback<Login>() { @Override public void onSuccess(Login result) { final Login login = injector.getLogin(); login.setAdmin(result.isAdmin()); login.setEmailAddress(result.getEmailAddress()); login.setKey(result.getKey()); login.setLoggedIn(result.isLoggedIn()); login.setLoginUrl(result.getLoginUrl()); login.setLogoutUrl(result.getLogoutUrl()); login.setNickname(result.getNickname()); login.setProfile(result.getProfile()); login.setReceiveEmail(result.getReceiveEmail()); login.setVersion(result.getVersion()); //TODO headerもdisplay化? RootPanel.get("header").clear(); RootPanel.get("header").add(new Header(login)); injector.getHistoryHandler().handleCurrentHistory(); History.addValueChangeHandler(new ValueChangeHandler<String>() { @Override public void onValueChange(ValueChangeEvent<String> event) { System.out.println(event.getValue()); System.out.println(Window.Location.getHash()); login.setLoginUrl(GWT.getHostPageBaseURL() + Window.Location.getQueryString() + Window.Location.getHash()); } }); } @Override public void onFailure(Throwable caught) { Window.alert("初期処理に失敗しました。再表示してください。"); } }); }
Updated by 啓介 大橋 almost 10 years ago
うーん、、、
ログで出てるのが一個前のやつだとすると、これだとダメかもですね、、、
昔やったときは行けてたんですが、、、
ではinjectorからeventBusを取得してPlaceEventでやってみていただいてもいいですか?
あとloginインスタンスの更新だけだとurl変わらないので、
Headerの作り直しと設定が必要ですね
Updated by yusuke kokubo almost 10 years ago
了解です。
MVPをよくわかってなくて申し訳ないのですが、
injectorからeventBusを取得するのってどこに書けば良いですか?
Updated by 啓介 大橋 almost 10 years ago
本来はHeaderクラスでコンストラクタインジェクションすべきだと思いますが
今回はHeaderクラスのコンストラクタにeventBusを追加して、
SkillMapsクラスでinjectorからeventBusを取得
Headerインスタンスを作成する際に渡すといいと思われます
イベント処理もHeader内にあるといいです
Updated by yusuke kokubo almost 10 years ago
あっゴメンなさい。
injector.getHistoryHandler().handleCurrentHistory()
する前に
History.addValueChangeHandler
すればできそうです!
Updated by yusuke kokubo almost 10 years ago
とりあえずできました。
ちょっと不恰好ですが…。
RootPanel.get("header").clear();
RootPanel.get("header").add(new Header(login));
History.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
login.setLoginUrl(login.getLoginUrl().replaceFirst(
"%23%21.+",
"%23" + event.getValue().replaceAll("!", "%21").replaceAll(":", "%3A")));
RootPanel.get("header").clear();
RootPanel.get("header").add(new Header(login));
}
});
injector.getHistoryHandler().handleCurrentHistory();
Updated by yusuke kokubo almost 10 years ago
デプロイしてみましたが、本番環境とURLが違ってたのでうまくいきませんでした^^;
http://feature-722.skillmaps.appspot.com/
もっとスマートな方法でやるしかないかなあ。
Updated by yusuke kokubo almost 10 years ago
- File 0001-refs-722.patch 0001-refs-722.patch added
どうあがいても無理っぽい。
ローカルだと動くんだけどなあ…。
Updated by yusuke kokubo almost 10 years ago
ページ遷移ごとにRPC使うのはあきらかに愚策なので妥協案としては
- ログインURLは/loginに固定
- センター側のLoginControllerでcreateLoginUrlしてリダイレクト
- ログインさせる
みたいな感じかなあ。
Updated by yusuke kokubo almost 10 years ago
もう一歩進化させて…
- ユーザーがログインリンクをクリックしたタイミングでRPCでURLを取得
- 取得したURLにアクセス
という流れかな。
Updated by 啓介 大橋 almost 10 years ago
オンクリックのタイミングでクッキーにハッシュ入れて
Skillmapsクラスであったらそこに遷移でもいいですね
遷移する直前でクッキーからは除去って感じで、、、
Updated by 啓介 大橋 almost 10 years ago
コメント19が分かりにくいので、書くと
- ログインリンクにはURL+クエリーストリングを含めたログイン先を設定
- ログインリンクにonClickイベントを追加
- 追加したイベントハンドラでクッキーにハッシュを入れる
- ログインして戻ってきたらSkillmapsクラスでクッキーに値があるか見る
- なければそのまま あったらハッシュのところへ遷移して、クッキー消す
懸念
ログイン中に他のところへいくとクッキーが残るので
有効期限を短めに設定する必要あり
Updated by yusuke kokubo almost 10 years ago
- File 0001-refs-722.patch 0001-refs-722.patch added
とりあえずこれでやりたいことはできました。
おーはしさんの考えた方法とはちょっと違うと思いますが見てもらってよいですか。
Updated by yusuke kokubo almost 10 years ago
- Status changed from 担当(Assigned) to 終了(Closed)
ひとまずstable-004にしました。
問題ありそうなら教えてください。