Запретить Wicket 8 AjaxEventBehavior onChange, чтобы НЕ ПЕРЕДАТЬ формы на дочерних страницах

Я использую Wicket 8, и у меня большая проблема:

У меня есть абстрактный BasePage, (HomePage расширяет BasePage) и (LoginPage расширяет BasePage)

Я использую BasePage для добавления панели навигации ко всем страницам, на которых есть DropDownChoice для изменения языка.

Вот соответствующие части моего кода:

public BasePage(PageParameters params){
        super(params);
        initPage();
    }

private void initPage(){
    createLocalesDCC();
    createHeaderLinks();
}

private void createLocalesDCC() {
    List<Locale> locales = Arrays.asList(Locale.ENGLISH, new Locale("ru"));
    final DropDownChoice<Locale> localeDDCSelection = new DropDownChoice<Locale>("changeLocale",
            new Model<Locale>(), locales, getLocalesChoiseRenderer());
    localeDDCSelection.add(new OnChangeAjaxBehavior() {

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            Session.get().setLocale(localeDDCSelection.getModelObject());
            target.add(getPage());
            System.out.println(getPage().getPageClass());
        }
    });
    localeDDCSelection.add(new AjaxPreventSubmitBehavior());
    localeDDCSelection.setModelObject(Session.get().getLocale());
    add(localeDDCSelection);
}

Когда localeDDC выполняет рендеринг, он устанавливает ModelObject текущего языка и отображает его. Когда я меняю язык - он перерисовывает всю страницу (используя выбранный язык)

Также у меня есть HomePage

public HomePage() {
    getTitle().setDefaultModel(Model.of("Home Page"));
}

Ничего интересного здесь, это просто пустая страница на данный момент. DropDownChoice с ajax работает отлично!

И вот полный код моего LoginPage:

public class LoginPage extends BasePage {

FeedbackPanel feedbackPanel;
RequiredTextField<String> userNameField;
PasswordTextField passwordTextField;
Button submitBtn;

public LoginPage(PageParameters parameters) {
    super(parameters);

    if (((AbstractAuthenticatedWebSession) getSession()).isSignedIn()) {
        continueToOriginalDestination();
    }
    add(getLoginForm("loginForm"));
}

private Form getLoginForm(String id) {
    Form form = new Form(id);

    feedbackPanel = new FeedbackPanel("feedback");
    userNameField = new RequiredTextField<String>("username");
    passwordTextField = new PasswordTextField("password");
    submitBtn = new Button("submitBtn") {
        @Override
        public void onSubmit() {
            AuthenticatedWebSession session = AuthenticatedWebSession.get();
            if (session.signIn(userNameField.getModelObject(), passwordTextField.getModelObject())) {
                setResponsePage(HomePage.class);
            } else {
                error("Login failed");
            }
        }
    };
    form.add(feedbackPanel, userNameField, passwordTextField, submitBtn);

    return form;
}

На этой странице у меня также есть верхняя панель навигации с языком DropDown (так же, как в HomePage), но DropDownChoice с ajax не работает так, как я хочу, потому что когда я меняю язык, он отправляет loginForm и пытается аутентифицироваться в onSumbit() этой формы, и он вызывается перед AjaxEventBehavior для localesDropDownChoice, поэтому ничего не происходит и возникает ошибка, поскольку он отправляет пустое поле (имя пользователя и пароль) и пытается войти в систему.

Как запретить AjaxEvent на DropDownChoise НЕ отправлять форму входа на расширенную страницу?

1 ответ

Решение

Нашел решение: я использую Spring Security, поэтому все действия после публикации на LoginPage выполняются SpringSecurity, поэтому я удалил это:

@Override
protected void configure(HttpSecurity http) throws Exception {
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    filter.setForceEncoding(true);
    http.addFilterBefore(filter, CsrfFilter.class);
    http.csrf().disable();

  http.authorizeRequests()
    .antMatchers("/home/**").permitAll()
    .antMatchers("/adminpanel/**").access("hasRole('ADMIN')")
    .antMatchers("/cabinet").access("hasRole('USER')or hasRole('ADMIN')")
    /*removeed*///.and().formLogin().loginPage("/login").failureUrl("/login?error")
    .and().exceptionHandling().accessDeniedPage("/403");
}
Другие вопросы по тегам