Expo Web环境下PUT/PATCH请求出现CORS错误,请求排查原因
Expo Web中PUT/PATCH请求出现CORS错误的排查与解决
问题根源
浏览器对于PUT、PATCH这类非简单请求会先发OPTIONS预检请求,询问后端是否允许该请求方法、Headers等。你的Spring Security配置中使用了applyPermitDefaultValues(),这个方法默认仅允许GET、HEAD、POST三种HTTP方法,并未包含PUT和PATCH,因此预检请求被后端拒绝,触发CORS错误。
而移动端(虚拟设备/真机)和Postman不会触发浏览器的预检机制,直接发送请求,所以能正常通过后端验证。
解决方案
修改Spring Security的CORS配置,手动指定允许的HTTP方法、Headers和Origin:
修改后的Security配置代码
import org.springframework.web.cors.CorsConfiguration; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Collections; protected void configure(HttpSecurity http) throws Exception { http.mvcMatcher("/api/**") .cors() .configurationSource(request -> { CorsConfiguration config = new CorsConfiguration(); // 允许所有Origin,生产环境建议替换为Expo Web的具体域名(如http://localhost:19006) config.setAllowedOriginPatterns(Collections.singletonList("*")); // 明确允许PUT、PATCH及其他需要的方法 config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")); // 允许请求中携带的Headers config.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type")); // 允许携带凭证(如Cookie) config.setAllowCredentials(true); return config; }) .and() .csrf() .disable() .authorizeRequests((requests) -> requests.antMatchers("/actuator/health", "/api/non-secured/patients/**", "/v3/api-docs/**", "/swagger-ui/**") .permitAll() .anyRequest() .authenticated()) .oauth2ResourceServer().jwt(); }
关键说明
- 替换
applyPermitDefaultValues():该方法的默认规则无法覆盖PUT/PATCH这类非简单请求,必须手动配置允许的方法列表。 - 允许OPTIONS方法:预检请求使用OPTIONS方法,必须确保后端允许该方法通过。
- Origin配置:生产环境避免使用通配符
*,建议指定Expo Web的具体访问域名(比如本地开发时的http://localhost:19006),提升安全性。 - Headers配置:确保包含请求中使用的
Authorization和Content-Type,避免因Headers不被允许触发CORS错误。
修改配置后重启后端服务,再在Expo Web中测试PUT/PATCH请求即可解决CORS问题。
内容的提问来源于stack exchange,提问作者Mert Batuhan ÜNVERDİ
相关产品推荐
相关产品推荐

