重定向到原始页面不起作用

时间:2017-10-11 14:11:36

标签: java wicket

我正在尝试创建一个Wicket 7.8.0应用程序,一切正常,除了在登录前访问的页面重定向到原始页面。

每当我尝试在未登录的情况下访问受保护的页面时,我都被正确地重定向到了SignIn页面,但是一旦我登录,我就被重定向到主页而不是原始页面。

这是我的应用程序类:

public class MyApplication extends AuthenticatedWebApplication {

    ...

    @Override
    public void init() {
        super.init();

        MetaDataRoleAuthorizationStrategy.authorize(HomePage.class, "TEST_ROLE");
        MetaDataRoleAuthorizationStrategy.authorize(SecuredPage.class, "TEST_ROLE");

        this.mountPage("signin", SignInPage.class);
        this.mountPage("homepage", HomePage.class);
        this.mountPage("secured/secured", SecuredPage.class);
        //this page is secured with annotations
        this.mountPage("secured/another", AnotherSecuredPage.class);

        this.getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
    }
}

为了登录,我使用了非常简化的SignIn页面:

public class SignInPage extends WebPage {

    private String username;
    private String password;

    private static final long   serialVersionUID    = 8096706227164750788L;

    public SignInPage() {
        this.add(new FeedbackPanel("feedback"));
        final Form<SignInPage> form = new Form<>("form");
        form.add(new TextField<>("username", new PropertyModel<String>(this, "username")));
        form.add(new PasswordTextField("password", new PropertyModel<String>(this, "password")));
        form.add(new SubmitLink("submit") {

            private static final long   serialVersionUID    = 6057698894229534492L;

            @Override
            public void onSubmit() {
                final Session session = SignInPage.this.getSession();
                if(session.signIn(SignInPage.this.username, SignInPage.this.password)) {
                    this.continueToOriginalDestination();
                    setResponsePage(getApplication().getHomePage());
                }
                else {
                    SignInPage.this.error("Bad username / password combo!");
                }
            }

        });
        final WebClientInfo clientInfo = (WebClientInfo) this.getSession().getClientInfo();
        this.add(new Label("userAgent", clientInfo.getUserAgent()));
        this.add(form);
    }
}

我在应用程序中至少登录一次后,如果我再次注销,每次重新登录时,重定向到原始页面都会有效。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

进一步调试后,我发现了问题。

在我的应用程序init()中,我正在使用this.getRequestCycleSettings().setGatherExtendedBrowserInfo(true);收集浏览器信息。在SignInPage上,我正在呼叫(WebClientInfo) this.getSession().getClientInfo()。这导致Wicket重定向到中间页面,该页面将收集浏览器信息,并在会话尚未初始化时首次调用登录页面时将其放入会话中。

由于此中介重定向,原始网页网址会丢失。它看起来像Wicket中的一个bug给我。

我发现解决此问题的唯一方法是直接从请求中检索原始 User-Agent 标头来替换WebClientInfo对象,并手动处理:

  1. 从应用程序初始化中删除this.getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
  2. 在SignInPage类中,替换

    final WebClientInfo clientInfo = (WebClientInfo) this.getSession().getClientInfo();
    this.add(new Label("userAgent", clientInfo.getUserAgent()));
    

    final WebRequest webRequest = ((WebRequest)this.getRequest());
    this.add(new Label("userAgent", webRequest.getHeader("User-Agent")));
    
  3. 现在,没有更多的中间重定向,重定向到原始页面也能正常工作。