3

Facebook などのサービスを使用した認証では、Facebook にリダイレクトし、Facebook が認証を行ってからリダイレクトします。リダイレクトが完了すると、コードが実行されて何らかの処理が行われ、応答ページが表示されます。どの応答ページが表示されるかは、さまざまな要因によって異なります。

現在行っていることは次のとおりです。

class RedirectTargetPage extends WebPage {
    @Override public void onBeforeRender() {
        String getParam = getRequest().getQueryParameters()
            .getParamterValue("get-param");
        ......
        if (...) setResponsePage(PageOne.class);
        else if (...) setResposnePage(PageTwo.class);
        else ... // etc
    }
}

次にurlFor(Class<Page>)、このページへの URL を検索し、それを Facebook に渡します。認証後、Facebook は私たちにリダイレクトします。すべて正常に機能します。

しかし、これは本当にページではありませんか?つまり、URL の背後にある単なるコードであり、最後にsetResponsePage. 私が書いていたのはリクエストを処理するものにすぎないように思えました。代わりに を作成して、次のようなものIRequestHandlerを使用して URL を取得できるように思えました。urlFor(IRequestHandler)

class RedirectTarget implements IRequestHandler {
    @Override public void respond(IRequestCycle requestCycle) {
        String getParam = requestCycle.getRequest().getQueryParameters()
            .getParameterValue("get-param");
        ....
        if (...) requestCycle.setResposnePage(..)
    }
}

悲しいかな、おurlFor(new RedirectTarget())届けしnullます!何がうまくいかないのですか?私に何ができる?オーバーライドonBeforeRederは機能しますが、エレガントに見えません....

4

4 に答える 4

0

RedirectTargetPageどのリダイレクト ページを使用するかを定義するために現在使用しているのと同じ条件に基づいて、さまざまなコンポーネントをロードすることでページを作成することもできますが、そのIRequesthandler方法も実行できるはずです。

JavaDoc から:

リクエスト ハンドラーのレンダリングされた URL を返します。ハンドラーをレンダリングできなかった場合は null を返します。

何らかの理由でハンドラーをレンダリングできないようです。urlForどこが間違っているのかを確認するために一歩踏み出しましたか?

于 2013-03-22T16:31:34.503 に答える
0

そのためにカスタムリクエストマッパーを使用できます。

public class FacebookResponseMapper implements IRequestMapper {

  @Override
  public int getCompatibilityScore(Request request) {
    if (getPage(request.getUrl()) != null) {
      return Integer.MAX_VALUE;
    }
    return 0;
  }

  @Override
  public IRequestHandler mapRequest(Request request) {
    Class<? extends Page> page = getPage(request.getUrl());
    if (page != null){
      return new RenderPageRequestHandler(new PageProvider(page));
    }

    return null;
  }

  /**
   * Get a page for the given url.
   */
  protected Class<? extends Page> getPage(Url url) {
    if (!url.getPath().startsWith("from-facebook") {
      return null;
    }

    // detect proper page depending on url parameters
    ...
  }

  @Override
  public Url mapHandler(IRequestHandler requestHandler) {
    return null;
  }
}

アプリケーションに登録します。

getRootRequestMapperAsCompound().add(new FacebookResponseMapper());
于 2013-03-22T17:35:37.313 に答える
0

私は同じ問題を抱えており、のカスタム実装も使用しましたIRequestHandlerただし、このようなハンドラーはページのようにタイプごとではなく、インスタンスごとにマウントされるため、これが良いアイデアであったかどうかはわかりません。

したがって、ページとは異なり、リクエスト ハンドラの単一のインスタンスをマウントします。たとえば、次のようになります。

mount(new MountMapper("path", CustomHandler.get()));

get() メソッドは、CustomHandler のシングルトン インスタンスを取得します。次に、次のようにリンクを生成できます。

CharSequence relativeUrl = RequestCycle.get().urlFor(CustomHandler.get());
String link = RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(relativeUrl));

これは私にとってはうまくいきました。

ただし、リンクを生成するときにクエリ パラメータを指定する方法がわかりません。ページでは、独自の特定のパラメーター マップを使用してページの新しいインスタンスを作成しますが、マウントされた 1 つのインスタンスのみを使用する必要があるため、これは機能しません。

于 2013-07-22T09:20:30.387 に答える