Project

General

Profile

Defect #722

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

Added by yusuke kokubo about 8 years ago. Updated about 8 years ago.

Status:
終了(Closed)
Priority:
通常(Normal)
Assignee:
Target version:
Start date:
04/27/2011
Due date:
% Done:

0%

Estimated time:

Description

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

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


Files

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

Associated revisions

Revision 7d689d7f (diff)
Added by yusuke kokubo about 8 years ago

ログイン後にもといたページに戻れるようにした refs #722

History

#1

Updated by 啓介 大橋 about 8 years ago

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

#2

Updated by yusuke kokubo about 8 years ago

  • Target version changed from Sprint11.04 to Sprint11.05
#3

Updated by yusuke kokubo about 8 years ago

  • Status changed from 新規(New) to 担当(Assigned)
  • Assignee set to yusuke kokubo

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

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

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

#4

Updated by 啓介 大橋 about 8 years ago

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

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

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

#5

Updated by 啓介 大橋 about 8 years ago

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

#6

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

Updated by 啓介 大橋 about 8 years ago

うーん、、、

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

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

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

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

#8

Updated by yusuke kokubo about 8 years ago

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

#9

Updated by 啓介 大橋 about 8 years ago

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

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

#10

Updated by yusuke kokubo about 8 years ago

あっゴメンなさい。

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

#11

Updated by 啓介 大橋 about 8 years ago

よかったです★彡

#12

Updated by yusuke kokubo about 8 years ago

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

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();
#13

Updated by yusuke kokubo about 8 years ago

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

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

#14

Updated by 啓介 大橋 about 8 years ago

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

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

#15

Updated by yusuke kokubo about 8 years ago

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

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

#16

Updated by 啓介 大橋 about 8 years ago

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

#17

Updated by yusuke kokubo about 8 years ago

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

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

みたいな感じかなあ。

#18

Updated by yusuke kokubo about 8 years ago

もう一歩進化させて…

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

という流れかな。

#19

Updated by 啓介 大橋 about 8 years ago

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

#20

Updated by 啓介 大橋 about 8 years ago

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

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

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

#21

Updated by yusuke kokubo about 8 years ago

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

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

#22

Updated by yusuke kokubo about 8 years ago

  • Status changed from 担当(Assigned) to 終了(Closed)

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

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

#23

Updated by 啓介 大橋 about 8 years ago

問題ないです☆

Also available in: Atom PDF