Spring+React项目部署VPS访问出现401未授权错误如何解决
问题核心成因
该报错本质是Spring Security的权限拦截规则覆盖了前端静态资源的访问路径:你在访问站点时,请求首先到达后端服务,触发权限校验逻辑,还没到返回静态前端页面的步骤就被拦截返回401,核心触发原因通常有三类:
- 前后端合并部署时,Spring Security未配置放行React静态资源路径,默认拦截所有请求
- 访问端口错误:前后端分开部署时,你误访问了后端服务的启动端口,而非前端托管的端口
- 静态资源映射规则错误,Spring Boot未识别到你存放的React静态资源,将路径当做接口请求触发拦截
解决方法
如果你是前后端合并部署(React打包后放入Spring Boot的resources/static目录一起启动)
- 修改Spring Security配置类,放行所有前端静态资源路径,参考代码:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth // 放行前端静态资源与页面路径 .requestMatchers("/", "/index.html", "/static/**", "/*.js", "/*.css", "/*.png", "/*.ico", "/manifest.json").permitAll() // 放行后端公开接口(如登录、验证码接口) .requestMatchers("/api/auth/**").permitAll() // 其余业务接口需要认证 .anyRequest().authenticated() ) .csrf(csrf -> csrf.disable()); return http.build(); } }
- 若自定义了静态资源存放路径,补充WebMvc资源映射配置:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/"); } }
- 如果你配置了
server.servlet.context-path上下文路径,需要在放行规则中加上对应前缀,或者直接用/**匹配所有静态资源路径。
如果你是前后端分开部署(前端用Nginx托管,后端单独启动)
- 确认你访问的是前端托管对应的端口(通常是Nginx监听的80端口),而非后端服务的启动端口(如8080)。
- 调整Nginx配置,仅将后端接口请求转发到后端服务,其余请求返回React前端页面,参考配置:
server { listen 80; server_name 你的VPS公网IP; # 前端静态资源匹配 location / { root /usr/share/nginx/react-dist; # 替换为你的React打包后dist目录的绝对路径 try_files $uri $uri/ /index.html; } # 后端接口转发 location /api/ { proxy_pass http://127.0.0.1:8080; # 替换为你的后端服务本地监听地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
改完配置后重启对应服务,清除浏览器缓存重新访问即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

