Java 防止Wicket 8 AjaxEventBehavior onChange在子页面上不提交表单

Java 防止Wicket 8 AjaxEventBehavior onChange在子页面上不提交表单,java,ajax,wicket,java-ee-8,Java,Ajax,Wicket,Java Ee 8,我用的是Wicket 8,我有个大问题: 我有一个抽象的基本页面,(主页扩展基本页面)和(登录页面扩展基本页面) 我正在使用BasePage向所有页面添加导航栏,在这些页面上有一个下拉选项来更改语言 以下是我的代码的相关部分: public BasePage(PageParameters params){ super(params); initPage(); } private void initPage(){ createLocalesDCC(

我用的是Wicket 8,我有个大问题:

我有一个抽象的基本页面,(主页扩展基本页面)和(登录页面扩展基本页面)

我正在使用BasePage向所有页面添加导航栏,在这些页面上有一个下拉选项来更改语言

以下是我的代码的相关部分:

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);
}
这里没什么有趣的,现在只是一页空白。使用ajax的DropDownChoice工作得非常好

这是我登录页面的完整代码:

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;
}
公共类登录页面扩展了BasePage{
反馈面板;反馈面板;
RequiredTextField userNameField;
PasswordTextField PasswordTextField;
按钮提交tn;
公共登录页面(页面参数){
超级(参数);
if(((AbstractAuthenticatedWebSession)getSession()).isSignedIn()){
继续原创目标();
}
添加(getLoginForm(“loginForm”);
}
私有表单getLoginForm(字符串id){
表格=新表格(id);
反馈面板=新的反馈面板(“反馈”);
userNameField=新的RequiredTextField(“用户名”);
passwordTextField=新的passwordTextField(“密码”);
submitBtn=新按钮(“submitBtn”){
@凌驾
提交时公共无效(){
AuthenticatedWebSession会话=AuthenticatedWebSession.get();
if(session.signIn(userNameField.getModelObject(),passwordTextField.getModelObject()){
setResponsePage(HomePage.class);
}否则{
错误(“登录失败”);
}
}
};
添加(反馈面板、用户名字段、密码文本字段、submitBtn);
申报表;
}
在这个页面上,我还有顶部的导航栏和语言下拉菜单(和主页上的一样) 但是使用ajax的DropDownChoice并没有像我所希望的那样工作,因为当我更改语言时,它正在提交登录信息并尝试在此表单的onSumbit()中进行身份验证,并且在localesDropDownChoice的AjaxEventBehavior之前调用它,所以不会发生任何事情,也不会发生错误,因为它发送的是空字段(用户名和密码)并尝试登录

如何防止DropDownChoise上的AjaxEvent不提交扩展页面上的登录信息?

找到了一个解决方案: 我使用的是Spring Security,因此登录页面上的任何后期操作都由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");
}
@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");
}