Vaadin 23.0.9升级至23.1.0后sw.js导致路由拦截REST请求问题
结论
这是Vaadin 23.1.0版本引入的已确认回归Bug,并非Servlet映射配置错误。
根因
- 23.1.0版本修改了默认生成的
sw.js(Service Worker脚本)的请求拦截逻辑:23.0.9旧版本默认仅拦截Vaadin Router负责的前端导航请求,会自动透传匹配其他后端Servlet的路径;23.1.0版本默认拦截全站所有导航类请求,未自动排除非Vaadin处理的后端API路径。 - 请求拦截发生在浏览器侧:
sw.js安装激活后,会把匹配到的/rest/v1/*请求直接转发给Vaadin前端路由处理,根本不会发送到后端走Servlet映射匹配流程,这也是手动注销sw.js后请求立刻恢复正常的原因。
修复方案
- 临时方案1:保留PWA能力的前提下,自定义Service Worker配置,在配置中添加拦截排除规则,将
/rest/v1/*路径加入navigateFallbackDenylist列表,示例配置片段:
// 自定义sw配置中的导航拦截排除规则 navigateFallbackDenylist: [/^\/rest\/v1\//]
- 临时方案2:如果不需要PWA离线功能,直接移除应用启动类/主布局类上的
@PWA注解,框架将不再自动生成、注册sw.js,拦截问题会直接消失。 - 永久方案:升级到Vaadin 23.1.1及更高的23.1分支补丁版本,官方已经修复该默认规则问题,新版本会自动识别已注册的其他Servlet映射路径,默认排除API类路径不会被Service Worker拦截。
内容的提问来源于stack exchange,提问作者JJS
相关产品推荐
相关产品推荐

