java - 防止 Wicket 8 AjaxEventBehavior onChange 为不在子页​​面上提交表单

标签 java ajax wicket java-ee-8

我正在使用 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并显示它。 当我更改语言时 - 它将重新渲染整个页面(使用所选语言)

我还有主页

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

这里没什么有趣的,现在只是一个空白页面。使用 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;
}

在此页面上,我还有带有语言下拉菜单的顶部导航栏(与主页中相同) 但是使用ajax的DropDownChoice无法按我想要的方式工作,因为当我更改语言时,它是提交登录表单并尝试在此表单的onSumbit()中进行身份验证,并且在localesDropDownChoice的AjaxEventBehavior之前调用它,所以没有任何反应并且发生错误,因为它正在发送空字段(用户名和密码)并尝试登录。

如何防止 DropDownChoise 上的 AjaxEvent 不在扩展页面上提交登录表单?

最佳答案

找到解决方案: 我正在使用 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");
}

关于java - 防止 Wicket 8 AjaxEventBehavior onChange 为不在子页​​面上提交表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847708/

相关文章:

java - Mac : How to assign a file extension to be opened with my java . app 应用程序?

java - RuneScape 私有(private)服务器 - 缓存下载器

jquery - 如何使用 jquery 将数据追加到表中

java - Wicket 应用程序 : Image interpreted as text/html

java - 如何在 wicket 中本地化 javascript 文件

java - Wicket 口 6 : Including Javascript files to head with script tag

java - 密码保护 XSSFWorkBook Apache POI

java - Java 中的 WebSocket 编程 : client server communication issue

javascript - ajax成功后如何更改我的类数据?

jquery - AJAX调用后$不是函数错误