当前位置: 代码迷 >> java >> CORS 策略:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态
  详细解决方案

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

热度:37   发布时间:2023-07-31 11:00:16.0

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


不成功的修复 1:我尝试通过代理运行它。
-> 创建了一个与 package.json 并行的 proxy.config.json 并包含以下内容。
{
“/ldap/ ”:{
"目标": " ",
“安全”:假,
"logLevel": "调试",
"changeOrigin": 真
}
}
-> 在那里的脚本块中的 package.json 中添加了以下条目。
"start":"ng serve --proxy-config proxy.config.json",

-> 在服务类中,尝试调用我的 Spring Boot 后端休息 API,如下所示。
返回 this.http.get('/ldap');
现在,当我运行我的应用程序时,出现以下错误:

GET http://localhost:4200/ldap 404(未找到):zone.js:3243


不成功的修复 2:我在前端调用 Rest API 之前添加了以下标题。
getUserAuthenticatedFromLDAP() {
const httpOptions = {
标头:新的 HttpHeaders({
'crossDomain': '真',
'模式':'cors',
'allowCredentials': '真',
'起源':' ',
'allowedHeaders': ' ',
'Access-Control-Allow-Origin': ' ',
'访问控制允许方法':'GET',
'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
“访问控制最大年龄”:“86400”

})
};

返回 this.http.get(' ' , httpOptions);
}



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

@控制器
@CrossOrigin(origins = " ")
公共类欢迎控制器{

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

}

在这里,我再次遇到以下错误:



更多不成功的修复:

我什至尝试使用 application.properties 文件更改 Tomcat 的标头,但找不到足够的示例或代码段来进行任何更改。
在互联网上,有些人建议在 API 级别实现过滤器,但我不确定在哪个类中我需要添加那些覆盖的过滤器方法。
我被困在这个问题上 2 天了。

PS:我看到有些人在 API 层实现了 CORS 过滤器或实现了如下所示的类。 现在我的问题是,如果我在类下面实现,那么我需要在哪里引用这个类? 是 web.xml 还是其他任何地方。

@Configuration @EnableWebSecurity
公共类 WebSecurityConfig 扩展了 WebSecurityConfigurerAdapter {

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

请看,您需要在您的方法/控制器中启用 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));
}
  相关解决方案