防止 Wicket 8 AjaxEventBehavior onChange 不提交子页面上的表单
Prevent Wicket 8 AjaxEventBehavior onChange to NOT SUBMIT forms on child pages
我正在使用 Wicket 8,但我遇到了一个大问题:
我有一个抽象的 BasePage,(HomePage extends BasePage)和(LoginPage extends 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() 中进行身份验证,并且它是在 AjaxEventBehavior 之前为 localesDropDownChoice 调用的,所以没有任何反应并且发生了错误,因为它正在发送空字段(用户名和密码)并尝试登录。
如何防止 DropDownChoise 上的 AjaxEvent 不在扩展页面上提交登录表单?
找到解决方案:
我正在使用 Spring 安全性,因此 LoginPage 上的任何 post 操作都是由 Spring 安全性进行的,所以我删除了这个:
@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");
}
我正在使用 Wicket 8,但我遇到了一个大问题:
我有一个抽象的 BasePage,(HomePage extends BasePage)和(LoginPage extends 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() 中进行身份验证,并且它是在 AjaxEventBehavior 之前为 localesDropDownChoice 调用的,所以没有任何反应并且发生了错误,因为它正在发送空字段(用户名和密码)并尝试登录。
如何防止 DropDownChoise 上的 AjaxEvent 不在扩展页面上提交登录表单?
找到解决方案: 我正在使用 Spring 安全性,因此 LoginPage 上的任何 post 操作都是由 Spring 安全性进行的,所以我删除了这个:
@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");
}