CORS 策略:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

Posted

技术标签:

【中文标题】CORS 策略:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态【英文标题】:CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status 【发布时间】:2019-07-07 08:52:27 【问题描述】:

我使用 Angular6 作为在 http://localhost:4200 上运行的前端和 Spring Boot(它具有内置的 Tomcat 服务器)作为在 上运行的后端(公开 GET Rest API) https://localhost:8083/ldap 。当我运行它时,我在浏览器上收到 CORS 策略错误。所以我在互联网上搜索并尝试了互联网上建议的多个修复程序。我不确定以下每个解决方案都缺少什么。

不成功的修复 1: 我尝试通过代理运行它。 -> 与 package.json 并行创建了一个 proxy.config.json,如下所示 内容。 "/ldap/": "目标": "https://localhost:8083", “安全”:假, "logLevel": "调试", “changeOrigin”:真 -> 在脚本块内的 package.json 中添加了以下条目。"start":"ng serve --proxy-config proxy.config.json", -> 在服务类中,尝试调用我的spring boot backend rest API 如下所示。return this.http.get('/ldap'); 现在,当我运行我的应用程序时,出现以下错误: GET http:// localhost:4200/ldap 404(未找到):zone.js:3243 不成功的修复 2: 我在调用 Rest API 之前添加了以下标题在我的前端。 getUserAuthenticatedFromLDAP() 常量 httpOptions = 标头:新的 HttpHeaders( 'crossDomain':'true', '模式' : 'cors', 'allowCredentials': 'true', '起源':'', 'allowedHeaders': '', 'Access-Control-Allow-Origin': '', '访问控制允许方法':'GET', 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept', “访问控制最大年龄”:“86400” ) ; 返回 this.http.get('https://localhost:8083' , httpOptions);  

从源“http://localhost:4200”访问“https://localhost:8083/”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok状态。

不成功的修复 3: 我没有在前端进行更改,而是尝试通过在控制器级别添加以下代码来在 API 级别进行更改。

@控制器 @CrossOrigin(origins = "http://localhost:4200") 公共类 WelcomeController

// This is for LDAP Authentication
@GetMapping("/ldap")
@ResponseBody
public Authentication hello() 
    return LdapSecurity.getAuthentication();

这里我再次遇到错误:

从源“http://localhost:4200”访问“https://localhost:8083/”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok状态。

更多不成功的修复:

我什至尝试使用 application.properties 文件更改 Tomcat 的标头,但找不到足够的示例或代码片段来进行任何更改。 在互联网上,有些人建议在 API 级别实现过滤器,但我不确定在哪个类中我需要添加那些覆盖的过滤器方法。 过去两天我一直在这个问题上。 PS:我看到有些人在 API 层实现了 CORS 过滤器或实现了如下所示的类。现在我的问题是,如果我在下面的类中实现,那么我需要在哪里引用这个类?是 web.xml 还是其他任何地方。

@配置 @EnableWebSecurity 公共类 WebSecurityConfig 扩展 WebSecurityConfigurerAdapter

【问题讨论】:

您需要从服务器(API)端启用 CORS 因为我使用的是嵌入了 tomcat 的 Springboot。知道如何在那里启用 CORS 吗? 不,我不知道在 springboot 中启用。或者,您可以启用 Chrome CORS 扩展以用于开发目的chrome.google.com/webstore/detail/allow-control-allow-origi/… 您的后端不应授权预检请求(您看到的 OPTIONS 请求从您的浏览器中发出)。您必须有一些安全层后端为这些请求返回 401/403。安全层应该简单地忽略预检请求。 @sp00m : 我正在使用带有嵌入式 tomcat 服务器的 spring boot,所以你能建议我在哪里以及在哪个文件中进行更改以解决这个问题 【参考方案1】:

请看here,你需要在你的方法/控制器中启用cors

@CrossOrigin(origins = "http://localhost:9000")
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) 
    System.out.println("==== in greeting ====");
    return new Greeting(counter.incrementAndGet(), String.format(template, name));

【讨论】:

我在我的控制器中像上面一样实现了,即在方法之上,但结果仍然相同:( 您是否指定了 localhost:4200 的来源?您也可以尝试使用 origins="*",但仅用于测试目的【参考方案2】:

我使用 Spring 安全功能进行 LDAP 身份验证。但现在我删除了 LDAP 的 Spring 安全功能,并使用 java 中的一个基本程序与 LDAP 建立连接。之后我在控制器层使用了 CrossOrigin 标签,现在我没有遇到 CORS 问题。谢谢大家的帮助。

【讨论】:

以上是关于CORS 策略:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态的主要内容,如果未能解决你的问题,请参考以下文章

来源已被 CORS 策略阻止 对预检请求的响应未通过访问控制检查

cors 策略错误:对预检请求的响应未通过访问控制检查:没有'Access-Control-Allow-Origin

CORS 策略:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP OK 状态

domain.com 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

Laravel 7 CORS:被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”