Vaadin 23自定义PageNotFound路由返回200而非404问题排查
问题分析与修复方案
你的代码问题出在Vaadin的默认行为上:即使你在setErrorParameter返回了404状态码,Vaadin默认不会将该状态码写入HTTP响应(尤其是单页应用模式下,客户端路由跳转不会触发新的HTTP请求),导致浏览器收到的仍是200 OK。
修复方法
方法1:手动设置HTTP响应状态码
在setErrorParameter方法中,直接通过BeforeEnterEvent获取HttpServletResponse并设置状态码:
@ParentLayout(MainLayout.class) @AnonymousAllowed public class PageNotFound extends RouteNotFoundError { @Override public int setErrorParameter(BeforeEnterEvent event, ErrorParameter<NotFoundException> parameter) { VerticalLayout verticalLayout = new VerticalLayout(); // 你的布局逻辑 getElement().insertChild(0, verticalLayout.getElement()); // 手动设置响应状态码 if (event.getHttpServletResponse() != null) { event.getHttpServletResponse().setStatus(HttpServletResponse.SC_NOT_FOUND); } return HttpServletResponse.SC_NOT_FOUND; } }
方法2:开启Vaadin的错误状态码发送功能
如果是Spring Boot项目,在application.properties中添加配置:
vaadin.servlet.send-error-codes=true
如果是传统Web项目,在web.xml的Vaadin Servlet配置里添加初始化参数:
<servlet> <servlet-name>VaadinServlet</servlet-name> <servlet-class>com.vaadin.flow.server.VaadinServlet</servlet-class> <init-param> <param-name>sendErrorCodes</param-name> <param-value>true</param-value> </init-param> </servlet>
说明
- 方法1适用于需要在特定错误页面中自定义状态码的场景,确保服务器端直接返回的请求能正确设置状态码。
- 方法2是全局配置,开启后Vaadin会自动将错误状态码发送到客户端,适用于所有错误页面的统一处理。
内容的提问来源于stack exchange,提问作者alexanoid
相关产品推荐
相关产品推荐

