JSF InputText搭配USB条码扫描器工作异常,扫描后触发登出跳转
问题根因
你遇到的异常由两个核心原因导致:
- 你贴的代码存在语法错误:
<p:inputText>的maxlength属性缺少闭合双引号,会导致页面DOM结构解析异常,绑定的blur ajax事件根本没有生效。 - USB条码扫描器默认会在扫描完成后追加换行符(ASCII 13)或制表符(ASCII 9),如果你的输入框放在
<h:form>标签内,换行符会触发表单的默认提交行为,当表单没有配置显式的提交处理逻辑时,就会触发默认跳转,进而触发会话校验逻辑导致登出。
具体解决方案
- 第一步先修复代码语法错误,将maxlength属性补全闭合引号:
<h:outputText value="barcode*" /> <p:inputText value="#{myBean.barcode}" maxlength="16"> <p:ajax event="blur" update="@this" listener="#{myBean.checkBarcode()}"/> </p:inputText>
- 第二步拦截扫描器追加的控制字符的默认行为,给
<p:inputText>添加onkeydown属性,拦截回车、制表符的默认动作:
<p:inputText value="#{myBean.barcode}" maxlength="16" onkeydown="if(event.keyCode === 13 || event.keyCode === 9) {event.preventDefault(); this.blur();}">
上述代码会在检测到回车或制表符时,阻止默认的表单提交/切换焦点行为,同时主动触发输入框失焦,让你绑定的blur ajax事件可以正常触发checkBarcode方法。
- 第三步如果仍有异常,可给外层的
<h:form>添加onsubmit="return false;"属性,彻底禁止表单的默认提交行为,所有交互都走自定义的ajax逻辑即可。 - 额外优化建议:可以在
MyBean类的setBarcode方法中添加过滤逻辑,自动移除字符串中所有不可见的ASCII控制字符,避免脏数据进入业务逻辑。
内容的提问来源于stack exchange,提问作者Mariano Mariani
相关产品推荐
相关产品推荐

