Spring Boot 3迁移后登录页面加载异常及登录跳转失败问题
Vaadin Security迁移到Spring Boot3后的登录页面异常排查方案
问题现象
将项目从Vaadin Security迁移至Spring Boot 3后,访问localhost:8080登录页面时,页面尚未完全加载控制台就输出错误日志,输入用户名密码后无法跳转至主页面。
关键日志信息
[nio-8080-exec-6] s.w.a.DelegatingAuthenticationEntryPoint : Match found! Executing org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint@1abc3085 [nio-8080-exec-6] o.s.s.web.DefaultRedirectStrategy : Redirecting to http://localhost:8080/login [nio-8080-exec-7] o.s.security.web.FilterChainProxy : Securing GET /login [nio-8080-exec-7] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext [nio-8080-exec-7] o.s.security.web.FilterChainProxy : Secured GET /login [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet : GET "/login", parameters={} [nio-8080-exec-7] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ParameterizableViewController [view="login"] [nio-8080-exec-7] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor [nio-8080-exec-7] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, */*;q=0.8, application/signed-exchange;v=b3;q=0.7] [nio-8080-exec-7] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet : Completed 200 OK [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : GET "/css/main.css", parameters={} [nio-8080-exec-8] nServletConfiguration$RootExcludeHandler : Mapped to org.springframework.web.servlet.mvc.ServletForwardingController@51d2218e [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[springServlet] : The response class [class org.springframework.security.web.firewall.FirewalledResponse] could not be unwraped to the Catalina response class and will be closed immediately after the forward [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : Completed 404 NOT_FOUND [l-2 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-2 - Pool stats (total=10, active=0, idle=10, waiting=0) [l-2 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-2 - Fill pool skipped, pool has sufficient level or currently being filled (queueDepth=0). [nio-8080-exec-9] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header java.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1288) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1176) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:785) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:348) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:264) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] [nio-8080-exec-9] o.apache.coyote.http11.Http11Processor : Error state [CLOSE_CONNECTION_NOW] reported while processing request java.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1288) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1176) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:785) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:348) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:264) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
问题分析
- 静态资源404:
/css/main.css返回404,说明Spring Boot未正确映射静态资源路径,可能是迁移后静态资源配置丢失或路径变更。 - Spring Security防火墙与Vaadin Servlet冲突:日志中
FirewalledResponse无法被Catalina响应类unwrap,是因为Spring Security的防火墙包装了响应对象,而Vaadin的Servlet转发时无法正确解析该响应,导致请求处理异常。 - EOFException:该异常是连接提前关闭的表现,大概率是前面的静态资源加载失败、响应处理异常导致页面加载中断,进而触发连接关闭错误。
解决方案
1. 修复静态资源映射
确保Spring Boot能正确访问静态资源:
- 确认
main.css放在src/main/resources/static/css/目录下(Spring Boot默认静态资源目录)。 - 如果自定义了静态资源路径,在
application.properties或application.yml中配置:spring.web.resources.static-locations=classpath:/static/,classpath:/public/,classpath:/resources/
2. 调整Spring Security配置,排除Vaadin相关路径
Spring Boot3中,需要让Spring Security不对Vaadin的内部请求进行拦截,同时处理登录页面的资源访问:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth // 允许静态资源匿名访问 .requestMatchers("/css/**", "/js/**", "/images/**").permitAll() // 允许Vaadin内部资源匿名访问 .requestMatchers("/VAADIN/**").permitAll() // 允许登录页匿名访问 .requestMatchers("/login").permitAll() // 其他请求需要认证 .anyRequest().authenticated() ) .formLogin(form -> form .loginPage("/login") .defaultSuccessUrl("/", true) // 登录成功后跳转主页面 .permitAll() ) .logout(logout -> logout.permitAll()) // 关闭CSRF(Vaadin自身处理CSRF,避免冲突) .csrf(csrf -> csrf.disable()) // 调整防火墙配置,避免响应包装冲突 .securityContext((securityContext) -> securityContext .requireExplicitSave(false) ); return http.build(); } }
3. 确保Vaadin与Spring Boot3版本兼容
- 检查
pom.xml中Vaadin依赖版本为24.x(适配Spring Boot3的最低版本),且引入vaadin-spring-boot-starter依赖。 - 确认Vaadin的自动配置类正常生效,无需手动配置Vaadin Servlet。
4. 排查EOFException
EOFException一般是衍生问题,解决前面的静态资源和Security配置问题后,页面能正常加载,该异常通常会自动消失。如果仍存在,可尝试:
- 清理浏览器缓存,重新访问。
- 检查Tomcat连接超时配置,确保时间设置合理。
内容的提问来源于stack exchange,提问作者Curious_Soul
相关产品推荐
相关产品推荐

