【问题标题】:CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok statusCORS 策略:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态
【发布时间】: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,所以你能建议我在哪里以及在哪个文件中进行更改以解决这个问题

标签: java angular spring-boot cors


【解决方案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 问题。谢谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 2020-06-06
    • 1970-01-01
    • 2020-01-29
    • 2020-02-11
    • 2020-01-14
    • 2021-09-16
    • 2021-03-17
    • 2021-07-11
    相关资源
    最近更新 更多