Vaadin按钮Enter快捷键遭防火墙拦截,求无需放行参数的方案
问题
为Vaadin Button设置Enter键作为点击快捷键时,请求被浏览器防火墙拦截。
添加快捷键的代码如下:
Button login = new Button("Login"); login.addClickListener(event -> this.login()); login.addClickShortcut(Key.ENTER);
按下Enter键时请求被拦截,检查后发现请求体中包含一段JavaScript表达式作为参数名:
(['Enter'].indexOf(event.code) !== -1 || ['Enter'].indexOf(event.key) !== -1) && !event.getModifierState('Shift') && !event.getModifierState('Control') && !event.getModifierState('Alt') && !event.getModifierState('AltGraph') && !event.getModifierState('Meta') && (event.stopPropagation() || true)
完整请求体:
{ "csrfToken": "20cbee30-71bf-4d76-830a-2871bd851238", "rpc": [ { "type": "event", "node": 1, "event": "keydown", "data": { "event.shiftKey": false, "event.metaKey": false, "event.code": "Enter", "event.key": "Enter", "event.isComposing": false, "(['Enter'].indexOf(event.code) !== -1 || ['Enter'].indexOf(event.key) !== -1) && !event.getModifierState('Shift') && !event.getModifierState('Control') && !event.getModifierState('Alt') && !event.getModifierState('AltGraph') && !event.getModifierState('Meta') && (event.stopPropagation() || true)": true, "event.ctrlKey": false, "event.repeat": false, "event.location": 0, "event.altKey": false } } ], "syncId": 3, "clientId": 3 }
请问在无需放行该参数的前提下,是否有可行的解决办法?
可行解决办法
方法1:手动监听全局Enter键事件触发按钮点击
绕过Vaadin内置的addClickShortcut,直接在UI层面监听Enter键按下事件,手动调用按钮的点击逻辑,避免生成带JS表达式的请求参数。
代码示例:
Button login = new Button("Login"); login.addClickListener(event -> this.login()); // 监听全局键盘事件,仅在按钮可用可见时触发 UI.getCurrent().addShortcutListener(Key.ENTER, event -> { if (login.isEnabled() && login.isVisible()) { login.click(); } });
方法2:利用表单原生提交行为绑定Enter键
如果按钮是表单的提交按钮,将其设置为表单默认提交按钮,借助HTML表单原生的Enter提交逻辑,无需依赖Vaadin的快捷键机制。
代码示例:
FormLayout form = new FormLayout(); Button login = new Button("Login"); login.addClickListener(event -> this.login()); // 设置按钮为表单提交类型 login.getElement().setAttribute("type", "submit"); form.add(/* 用户名、密码等表单组件 */, login); // 监听表单提交事件,阻止默认跳转并触发自定义登录逻辑 form.getElement().addEventListener("submit", e -> { e.preventDefault(); login.click(); });
方法3:自定义快捷键处理器
通过ShortcutRegistration手动绑定快捷键,直接触发按钮点击,避免Vaadin自动生成包含JS表达式的参数。
代码示例:
Button login = new Button("Login"); login.addClickListener(event -> this.login()); // 注册仅监听Enter键的快捷键,无额外修饰符 new ShortcutRegistration(login, Key.ENTER) .addListener(e -> login.click());
内容的提问来源于stack exchange,提问作者Saad Tariq
相关产品推荐
相关产品推荐

