401 响应 CORS preflight OPTIONS 请求到 Spring Boot 服务器
Posted
技术标签:
【中文标题】401 响应 CORS preflight OPTIONS 请求到 Spring Boot 服务器【英文标题】:401 response for CORS preflight OPTIONS request to springboot server 【发布时间】:2021-02-22 05:20:53 【问题描述】:从我的 Angular 应用程序到 Spring Boot 后端的跨域请求被 CORS 阻止,仅使用 POST、PUT。允许 GET 并按预期工作。
这是我的配置..
后端:
cors 过滤器 -
@Configuration
public class CORSConfiguration
@Bean
public CorsFilter corsFilter()
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
corsConfiguration.setAllowedMethods(Arrays.asList("PUT", "POST", "GET", "DELETE", "OPTIONS"));
corsConfiguration.setAllowedHeaders(Arrays.asList("Origin", "X-Requested-With", "X-Requested-By",
"Content-Type", "Accept", "Authorization"));
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(source);
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
httpSecurity.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS).permitAll()
.antMatchers("/*").authenticated().and()
.jee().mappableAuthorities("xxxxxxx");
ng:
public postIT(payload: Data): Observable<Data>
return this.http.post<Data>(url, payload) ,
withCredentials: true
);
错误:
我在这里遗漏了什么?请告诉我。
【问题讨论】:
具体问题是服务器响应 CORS 预检 OPTIONS 请求时出现 401 错误 - 显然是因为它需要对路由甚至 OPTIONS 请求进行身份验证。解决方法是必须更改服务器配置,以便它允许未经身份验证的 OPTIONS 请求,并以 200 OK 响应它们。在***.com/a/45406085/441757查看答案 对,我已经允许 OPTIONS req 绕过身份验证。通过设置:.antMatchers(HttpMethod.OPTIONS,"/**").permitAll()
显然绕过不足以阻止该路由允许未经身份验证的 OPTIONS 请求。否则,您将不会收到对 OPTIONS 请求的 401 响应。 i.stack.imgur.com/9ojsO.jpg 处的图片绝对表明您收到了对 OPTIONS 请求的 401 响应。
【参考方案1】:
您能否尝试将“AllowedHeaders”替换为以下列表:
“Access-Control-Allow-Credentials”、“Content-Type”、“Access-Control-Allow-Headers”、“X-Requested-With”、“Origin”、“Accept”
【讨论】:
只是为了理解的目的,请您解释一下为什么这会有所帮助。 “Access-Control-Allow-Credentials”标头告诉浏览器是否在请求的凭据模式下将响应暴露给前端 javascript 代码。浏览器在发出预检请求时使用“Access-Control-Request-Headers”标头,让服务器知道客户端在发出实际请求时可能会发送哪些 HTTP 标头。 以上方法都试过了,问题依旧。【参考方案2】:我犯的错误是在 web.xml 中,其中 OPTIONS 包含在 <security-constraint>
元素中。
从这里删除它,其余配置保持不变,我不再看到问题。
【讨论】:
以上是关于401 响应 CORS preflight OPTIONS 请求到 Spring Boot 服务器的主要内容,如果未能解决你的问题,请参考以下文章
CORS preflight OPTIONS 请求从 Windows Authenticated web api 返回 401(未授权)
Express 服务器和 Axios CORS Preflight 响应不成功
CORS Preflight 响应包括 Vary:Origin 和 Access-Control-Max-Age?
对 CORS preflight OPTIONS 请求的响应是 Laravel API 中的 500 Internal Server Error