3

对于 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

我有同样的问题,还使用了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));

这对我有用。

但是,我看不到在生成链接时如何指定查询参数。对于页面,您将使用其自己的特定参数映射创建页面的新实例,但由于我们必须使用已安装的一个实例,所以这不起作用。

于 2013-07-22T09:20:30.387 回答
0

我可能会误解,但是为什么您需要所有这些额外的非页面内容?

您将与用户做某事,为什么不将他们直接发送到他们想要访问的页面并使用命名参数来引导他们?

例子:

@MountPath(value = "/handlerpage/${fromparam}")
public class MyHandlerPage extends WebPage {
    public MyHandlerPage(PageParameters parameters) {
    super(parameters);
    final StringValue fromParam = parameters.get("fromparam");
        // Do my thing with page depending on the param.
    }
}

这将允许您跳过所有时髦的请求处理程序代码。如果需要,您甚至可以使用选项参数进行设置。

于 2013-09-13T14:24:58.750 回答
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 回答