プロジェクト

全般

プロフィール

Defect #722

完了

ログイン後にもといたページに戻りたい

yusuke kokubo さんが約13年前に追加. ほぼ13年前に更新.

ステータス:
終了(Closed)
優先度:
通常(Normal)
担当者:
対象バージョン:
開始日:
2011/04/27
期日:
進捗率:

0%

予定工数:

説明

マイページとか開いてるときにログインすると、トップページに戻ってしまう。
できればログイン後はもといたページに戻りたい。

Skillmaps.java#31
injector.getAccountService().login(GWT.getHostPageBaseURL() + Window.Location.getQueryString(),
にパラメータをつければいけるんだけど、":mypage:"とかって文字列はどうやって取得すれば良いのだろう?


ファイル

0001-refs-722.patch (5.89 KB) 0001-refs-722.patch yusuke kokubo, 2011/05/11 17:10
0001-refs-722.patch (10.7 KB) 0001-refs-722.patch yusuke kokubo, 2011/05/12 15:50

啓介 大橋 さんが約13年前に更新

ちょっと試してはいないですけど、
確かHistory.getToken()とかでとれた気がします。
それかWindow.Navigationのメソッドであったようなぁ、、、

yusuke kokubo さんがほぼ13年前に更新

  • 対象バージョンSprint11.04 から Sprint11.05 に変更

yusuke kokubo さんがほぼ13年前に更新

  • ステータス新規(New) から 担当(Assigned) に変更
  • 担当者yusuke kokubo にセット

試してみたらWindow.Location.getHash()でとれることはとれました。

ただ、これだとページ読み込み時にログイン後の遷移URLが固定されてしまうので、
ごちょごちょ動きまわってからログインすると意味ないです。

これちゃんとやろうと思ったら、ページ遷移するたびにログインURLを書き換えるような小細工が必要ですね…。
Window.Location.getHash()でとれることはとれるのでそんなに難しくはないのかもしれませんが

啓介 大橋 さんがほぼ13年前に更新

EventBusのaddEventでPlaceChangeEvent,PlaceEventHandler.Handlerを登録すれば、
Historyが変わるタイミングを拾えますよー

それかHistoryのaddValueChangeHandlerでも行けるはずです。

いまHeaderはdiコンテナで管理してないので実装はHistoryの方が簡単ですが、
思想的にはHeaderをDIコンテナ管理にしてeventBusをinjectionするか、
headerのpresenterをつくってそこでイベント登録するべきかもですね。

啓介 大橋 さんがほぼ13年前に更新

出先なんでコード出せなくて申し訳ないです、、、

yusuke kokubo さんがほぼ13年前に更新

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("初期処理に失敗しました。再表示してください。");
            }
    });
}

啓介 大橋 さんがほぼ13年前に更新

うーん、、、

ログで出てるのが一個前のやつだとすると、これだとダメかもですね、、、

昔やったときは行けてたんですが、、、

ではinjectorからeventBusを取得してPlaceEventでやってみていただいてもいいですか?

あとloginインスタンスの更新だけだとurl変わらないので、
Headerの作り直しと設定が必要ですね

yusuke kokubo さんがほぼ13年前に更新

了解です。
MVPをよくわかってなくて申し訳ないのですが、
injectorからeventBusを取得するのってどこに書けば良いですか?

啓介 大橋 さんがほぼ13年前に更新

本来はHeaderクラスでコンストラクタインジェクションすべきだと思いますが
今回はHeaderクラスのコンストラクタにeventBusを追加して、
SkillMapsクラスでinjectorからeventBusを取得
Headerインスタンスを作成する際に渡すといいと思われます

イベント処理もHeader内にあるといいです

yusuke kokubo さんがほぼ13年前に更新

あっゴメンなさい。

injector.getHistoryHandler().handleCurrentHistory()
する前に
History.addValueChangeHandler
すればできそうです!

啓介 大橋 さんがほぼ13年前に更新

よかったです★彡

yusuke kokubo さんがほぼ13年前に更新

とりあえずできました。
ちょっと不恰好ですが…。

RootPanel.get("header").clear();
RootPanel.get("header").add(new Header(login));
History.addValueChangeHandler(new ValueChangeHandler&lt;String&gt;() {
@Override
public void onValueChange(ValueChangeEvent&lt;String&gt; 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();

yusuke kokubo さんがほぼ13年前に更新

デプロイしてみましたが、本番環境とURLが違ってたのでうまくいきませんでした^^;
http://feature-722.skillmaps.appspot.com/

もっとスマートな方法でやるしかないかなあ。

啓介 大橋 さんがほぼ13年前に更新

裏でこそっとrpc経由でログアウトurlとるしかないんですかね、、、

なんかうまくやれそうな気もしますけど

yusuke kokubo さんがほぼ13年前に更新

どうあがいても無理っぽい。
ローカルだと動くんだけどなあ…。

http://fix-722.skillmaps.appspot.com/

啓介 大橋 さんがほぼ13年前に更新

休みの日にハックしておきます(`・ω・´)キリッ

yusuke kokubo さんがほぼ13年前に更新

ページ遷移ごとにRPC使うのはあきらかに愚策なので妥協案としては

  • ログインURLは/loginに固定
  • センター側のLoginControllerでcreateLoginUrlしてリダイレクト
  • ログインさせる

みたいな感じかなあ。

yusuke kokubo さんがほぼ13年前に更新

もう一歩進化させて…

  • ユーザーがログインリンクをクリックしたタイミングでRPCでURLを取得
  • 取得したURLにアクセス

という流れかな。

啓介 大橋 さんがほぼ13年前に更新

オンクリックのタイミングでクッキーにハッシュ入れて
Skillmapsクラスであったらそこに遷移でもいいですね
遷移する直前でクッキーからは除去って感じで、、、

啓介 大橋 さんがほぼ13年前に更新

コメント19が分かりにくいので、書くと

  1. ログインリンクにはURL+クエリーストリングを含めたログイン先を設定
  2. ログインリンクにonClickイベントを追加
  3. 追加したイベントハンドラでクッキーにハッシュを入れる
  4. ログインして戻ってきたらSkillmapsクラスでクッキーに値があるか見る
  5. なければそのまま あったらハッシュのところへ遷移して、クッキー消す

懸念
ログイン中に他のところへいくとクッキーが残るので
有効期限を短めに設定する必要あり

yusuke kokubo さんがほぼ13年前に更新

とりあえずこれでやりたいことはできました。
おーはしさんの考えた方法とはちょっと違うと思いますが見てもらってよいですか。

http://fix-722.skillmaps.appspot.com/

yusuke kokubo さんがほぼ13年前に更新

  • ステータス担当(Assigned) から 終了(Closed) に変更

ひとまずstable-004にしました。

問題ありそうなら教えてください。

啓介 大橋 さんがほぼ13年前に更新

問題ないです☆

他の形式にエクスポート: Atom PDF