1

我正在尝试登录我的应用程序。首先我抛出 RestartResponseAtInterceptPageException (这是在我的 BasePage 的 WicketPanel 中):

add(new Link<String>("signin") {
   @Override
   public void onClick() {
       throw new RestartResponseAtInterceptPageException(SignIn.class);
   }
});

SignIn Page 类包含一个用于登录的表单(内部私有类),带有以下提交按钮:

add(new Button("signinButton") {

    @Override
    public void onSubmit() {
        final User user = model.getObject();
        final boolean result = MySession.get().authenticate(user);
        if (result) {
            if (!continueToOriginalDestination()) {
                setResponsePage(MySession.get().getApplication().getHomePage());
            }
         } else {
            error("Authentication failed");
         }
    }
 });

当单击此按钮并且用户成功通过身份验证时,我没有被重定向到单击登录链接的页面,而是停留在登录页面上?我试过调试这个,但一直没能找出哪里出了问题。

我很高兴有任何提示导致我发现自己的方式错误。

顺便说一句,这是检票口 1.5.1。

小更新,因为我从答案中得到了我需要的提示,还有一些解释要做。解决方案如下所示:

add(new Link<String>("signin") {
    @Override
    public void onClick() {
         setResponsePage(new SignIn(getPage()));
    }
});

SignIn 类有一个构造函数,该构造函数显然需要一个页面,我只是将该页面设置为 setResponsePage 以返回到我开始的位置,而没有所有 continueToOriginalDestination 和异常抛出。

4

1 回答 1

6

RestartResponseAtInterceptPageException旨在用于在呈现页面时重定向到拦截页面。例如,在 Page 类的构造函数中ProtectedPage,如果没有用户登录,则throw new RestartResponseAtInterceptPageException(SignIn.class). 当SignIn页面调用continueToOriginalDestination()时,用户被带回原来的ProtectedPage目的地。

你的使用不是典型的使用,RestartResponseAtInterceptPageException因为你把它扔到了一个链接处理程序中。你为什么不setResponsePage(SignIn.class)直接做一个呢?如果您真的想返回单击“登录”链接时所在的确切页面,您也可以尝试将其更改为:

add(new Link<String>("signin") {
   @Override
   public void onClick() {
       setResponsePage(getPage());
       throw new RestartResponseAtInterceptPageException(SignIn.class);
   }
});
于 2011-11-21T00:40:56.750 回答