我正在尝试创建一个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);
}
}
我在应用程序中至少登录一次后,如果我再次注销,每次重新登录时,重定向到原始页面都会有效。
我做错了什么?
答案 0 :(得分:2)
进一步调试后,我发现了问题。
在我的应用程序init()
中,我正在使用this.getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
收集浏览器信息。在SignInPage
上,我正在呼叫(WebClientInfo) this.getSession().getClientInfo()
。这导致Wicket重定向到中间页面,该页面将收集浏览器信息,并在会话尚未初始化时首次调用登录页面时将其放入会话中。
由于此中介重定向,原始网页网址会丢失。它看起来像Wicket中的一个bug给我。
我发现解决此问题的唯一方法是直接从请求中检索原始 User-Agent 标头来替换WebClientInfo
对象,并手动处理:
this.getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
。在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")));
现在,没有更多的中间重定向,重定向到原始页面也能正常工作。