【问题标题】:Why RestartResponseException in exception hanler doesn't redirect to other page?为什么异常处理程序中的 RestartResponseException 不会重定向到其他页面?
【发布时间】:2020-12-22 13:25:29
【问题描述】:

我在异常处理程序 (IRequestCycleListener) 中使用 RestartResponseException 在登录页面上进行重定向,但它不起作用。我在日志中看到异常,但 UI 没有变化。

        @Override
        public IRequestHandler onException(RequestCycle cycle, Exception ex) {
            if (couldNotLock) {
                getSessionStore().invalidate(cycle.getRequest());
                throw new RestartResponseException(LoginPage.class);
            }

            return null;
        }

【问题讨论】:

  • 当它不起作用时的实际行为是什么?你看到哪个页面?您是否在 DevTools > Network 选项卡中看到重定向响应(状态代码 == 302)?
  • 对不起,我写错了。没有会话失效(仅使用 RestartResponseException)页面使用代码 200 刷新但未重定向,我看到与以前相同的页面。会话失效时,页面不会刷新,我在 devtools 中看不到任何请求。我像以前一样看到页面。如果我使用 F5 我会看到登录页面,但它不是重定向(在 devtools 中仍然没有请求)

标签: java wicket


【解决方案1】:

即使您在问题的评论中提供了额外的信息,仍然不清楚您面临什么样的问题。

我会尝试猜测:您的 LoginPage 会检查用户是否已经登录,然后重定向到您的应用程序的登录/主页。

要解决您需要使整个会话无效的问题:

@Override
public IRequestHandler onException(RequestCycle cycle, Exception ex) {
    if (couldNotLock) {
       Session.get().invalidate();    // !!!
       throw new RestartResponseException(LoginPage.class);
    }

    return null;
}

【讨论】:

  • 感谢您的回答。我试了一下,得到了同样的结果,我仍然看到主页,但是在单击任何按钮或通过 F5 页面刷新页面后更改为登录页面。我希望在没有其他操作(如单击或刷新)的情况下获得登录页面。我认为 RestartResponseException 不起作用,因为我将其更改为在 NullPointerException 上进行实验并得到相同的结果,我认为页面更改是由会话失效引起的。
【解决方案2】:

尝试抛出 new RestartResponseAtInterceptPageException(LoginPage.class) 而不是 RestartResponseException

【讨论】:

  • 感谢您的回答。我试过了,没有发现与 RestartResponseException 有任何区别。仍然没有重定向。
【解决方案3】:

如果没有其他帮助,您可以使用 javascript 修改页面的 URL。

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(JavaScriptHeaderItem.forScript("window.history.pushState(\"object or string\", \"" + pageTitle + "\", \"" + pageUrl + "\")"));
}

对于 AJAX:

    AjaxRequestTarget target = optional.get();
    target.prependJavaScript("window.history.pushState(\"object or string\", \"" + pageTitle + "\", \"" + pageUrl + "\")");

【讨论】:

  • 这个想法很有趣,但是如何在我的异常处理程序(IRequestCycleListener)中实现它?我想我不能。
  • 您可以在 LoginPage 类中覆盖 renderHead(),以便它始终设置正确的 url。
猜你喜欢
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
相关资源
最近更新 更多