0

从 Wicket 6.23.0 升级到 7.4.0 后,我的 Wicket 页面上的登录功能不再起作用。

我得到一个 PageExpiredException:

14:50:31,772 WARN  [RequestCycleExtra] (default task-20) ********************************
14:50:31,773 WARN  [RequestCycleExtra] (default task-20) Handling the following exception: org.apache.wicket.protocol.http.PageExpiredException: Bookmarkable page with id 'null' has expired.
14:50:31,774 WARN  [RequestCycleExtra] (default task-20) ********************************

登录页面如下所示:

@MountPath("login")
public class LoginPage extends WebPage {

private static final long serialVersionUID = 1L;

public LoginPage() {
}

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(JavaScriptReferenceHeaderItem.forReference(JQueryJavaScriptResourceReference.get()));
    response.render(JavaScriptReferenceHeaderItem.forReference(JQueryUiJavaScriptResourceReference.get()));
    response.render(CssContentHeaderItem.forReference(JQueryUiCssResourceReference.get()));
}

@Override
protected void onInitialize() {
    super.onInitialize();

    IModel<AuthenticationData> model = new CompoundPropertyModel<>(new AuthenticationData());

    add(new FeedbackPanel("feedbackPanel"));

    @SuppressWarnings("serial")
    StatelessForm<AuthenticationData> form = new StatelessForm<AuthenticationData>("form", model) {

        /** {@inheritDoc} */
        @Override
        protected void onSubmit() {
            WebSession session = WebSession.get();
            if (session.signIn(getModelObject().getUserName(), getModelObject().getPassword())) {
                setResponsePage(getApplication().getHomePage());
            } else {
                error("Login failed due to invalid credentials");
            }
        }
    };
    add(form);

    TextField<String> userNameTextField = new TextField<>("userName");
    form.add(userNameTextField);

    PasswordTextField passwordTextField = new PasswordTextField("password");
    form.add(passwordTextField);

    SubmitLink submitLink = new SubmitLink("submitLink");
    form.add(submitLink);
        form.setDefaultButton(submitLink);
    }

}

StatelessForm 的 onSubmit 方法永远不会到达。

设置与此处类似:https ://ci.apache.org/projects/wicket/guide/7.x/guide/security.html#security_1

4

1 回答 1

0

问题是 LoginPage 上的 StatelessForm:

@MountPath("login")
public class LoginPage extends WebPage {

private static final long serialVersionUID = 1L;

public LoginPage() {
}

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(JavaScriptReferenceHeaderItem.forReference(JQueryJavaScriptResourceReference.get()));
    response.render(JavaScriptReferenceHeaderItem.forReference(JQueryUiJavaScriptResourceReference.get()));
    response.render(CssContentHeaderItem.forReference(JQueryUiCssResourceReference.get()));
}

@Override
protected void onInitialize() {
    super.onInitialize();

    IModel<AuthenticationData> model = new CompoundPropertyModel<>(new AuthenticationData());

    add(new FeedbackPanel("feedbackPanel"));

    @SuppressWarnings("serial")
    Form<AuthenticationData> form = new Form<AuthenticationData>("form", model) {

        /** {@inheritDoc} */
        @Override
        protected void onSubmit() {
            WebSession session = WebSession.get();
            if (session.signIn(getModelObject().getUserName(), getModelObject().getPassword())) {
                setResponsePage(getApplication().getHomePage());
            } else {
                error("Login failed due to invalid credentials");
            }
        }
    };
    add(form);

    TextField<String> userNameTextField = new TextField<>("userName");
    form.add(userNameTextField);

    PasswordTextField passwordTextField = new PasswordTextField("password");
    form.add(passwordTextField);

    SubmitLink submitLink = new SubmitLink("submitLink");
    form.add(submitLink);
        form.setDefaultButton(submitLink);
    }

}
于 2016-08-31T07:21:26.113 回答