Запретить 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");
}