Spring Boot OAuth2 CORS 在版本 2.2.1 中不起作用
Posted
技术标签:
【中文标题】Spring Boot OAuth2 CORS 在版本 2.2.1 中不起作用【英文标题】:Spring boot OAuth2 CORS not working in version 2.2.1 【发布时间】:2020-03-23 17:55:47 【问题描述】:当访问 Spring Boot 服务器时,它显示以下错误:
Access to XMLHttpRequest at 'http://localhost:8080/oauth/token' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
我的配置是,
http.cors();
CorsConfigurationSource corsConfigurationSource()
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
configuration.setAllowedMethods(Arrays.asList("GET","POST","OPTIONS"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
```
【问题讨论】:
在***.com/a/52227060/441757和***.com/a/44773723/441757和***.com/a/58475597/441757和***.com/a/53893204/441757查看答案 【参考方案1】:如果您提供这样的配置,Springboot 基本上会处理 cors 配置,但在您的情况下,这可能是因为 spring 安全性没有在您的响应标头中添加像 Access-Control-Allow-Origin
这样的 CORS 标头。当您发出 ajax 请求时, pre-flight 检查请求最初是向服务器发出的,服务器用一组 headers 响应,用于确定服务器是否支持 cors 请求。
当您添加 cors 配置时,来自浏览器的飞行前检查现在将由 Spring MVC 处理,但我们需要告诉 Spring Security 允许它通过,您可以通过添加像您这样的 cors 配置 bean 来完成提供,但您需要设置 http.cors
喜欢:
http.cors().and().authorizeRequests()
.anyRequest().authenticated();
以便对飞行前请求进行身份验证。
如果问题仍然存在(通过添加自定义过滤器): 因此,尝试添加一个过滤器以正确设置 CORS 标头(请根据需要从端点返回正确设置标头):
public class CorsFilter implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request= (HttpServletRequest) servletRequest;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,DELETE,PUT,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", true);
response.setHeader("Access-Control-Max-Age", 180);
filterChain.doFilter(servletRequest, servletResponse);
@Override
public void destroy()
当您在配置中设置http.cors()
时,它将从spring security 中排除飞行前检查。
【讨论】:
以上是关于Spring Boot OAuth2 CORS 在版本 2.2.1 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
spring boot with react前端oauth2代理CORS问题
如何使用密码授予在 Spring Boot Oauth2 资源服务器中处理 CORS
Spring Boot OAuth2 CORS 在版本 2.2.1 中不起作用
带有 Google 的 OAuth2 - CORS 错误(Angular + Spring boot)[重复]