Java Angular 7如何将Access Control Allow Origin标头添加到飞行前post请求?

Java Angular 7如何将Access Control Allow Origin标头添加到飞行前post请求?,java,angular,spring,typescript,Java,Angular,Spring,Typescript,我正在尝试发送帖子,但出现以下错误: 2zone-evergreen.js:2952 OPTIONS http://localhost:8080/api/infotel/createOrganisme 403 scheduleTask @ zone-evergreen.js:2952 scheduleTask @ zone-evergreen.js:378 onScheduleTask @ zone-evergreen.js:272 scheduleTask @ zone-evergreen.j

我正在尝试发送帖子,但出现以下错误:

2zone-evergreen.js:2952 OPTIONS http://localhost:8080/api/infotel/createOrganisme 403
scheduleTask @ zone-evergreen.js:2952
scheduleTask @ zone-evergreen.js:378
onScheduleTask @ zone-evergreen.js:272
scheduleTask @ zone-evergreen.js:372
scheduleTask @ zone-evergreen.js:211
scheduleMacroTask @ zone-evergreen.js:234
scheduleMacroTaskWithCurrentZone @ zone-evergreen.js:1107
(anonymous) @ zone-evergreen.js:2985
proto.<computed> @ zone-evergreen.js:1428
(anonymous) @ http.js:2065
_trySubscribe @ Observable.js:42
subscribe @ Observable.js:28
(anonymous) @ subscribeTo.js:20
subscribeToResult @ subscribeToResult.js:7
_innerSub @ mergeMap.js:59
_tryNext @ mergeMap.js:53
_next @ mergeMap.js:36
next @ Subscriber.js:49
(anonymous) @ scalar.js:4
_trySubscribe @ Observable.js:42
subscribe @ Observable.js:28
call @ mergeMap.js:21
subscribe @ Observable.js:23
call @ filter.js:13
subscribe @ Observable.js:23
call @ map.js:16
subscribe @ Observable.js:23
create @ create-organisme.component.ts:32
(anonymous) @ CreateOrganismeComponent.html:21
handleEvent @ core.js:34789
callWithDebugContext @ core.js:36407
debugHandleEvent @ core.js:36043
dispatchEvent @ core.js:22533
(anonymous) @ core.js:33721
(anonymous) @ platform-browser.js:1789
invokeTask @ zone-evergreen.js:391
onInvokeTask @ core.js:30885
invokeTask @ zone-evergreen.js:390
runTask @ zone-evergreen.js:168
invokeTask @ zone-evergreen.js:465
invokeTask @ zone-evergreen.js:1603
globalZoneAwareCallback @ zone-evergreen.js:1629
Show 12 more frames
display:1 Access to XMLHttpRequest at 'http://localhost:8080/api/infotel/createOrganisme' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
core.js:7187 ERROR HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: "http://localhost:8080/api/infotel/createOrganisme", ok: false, …}
2zone evergreen.js:2952选项http://localhost:8080/api/infotel/createOrganisme 403
scheduleTask@zone evergreen.js:2952
scheduleTask@zone evergreen.js:378
onScheduleTask@zone evergreen.js:272
scheduleTask@zone evergreen.js:372
scheduleTask@zone evergreen.js:211
scheduleMaroctask@zone everyvan.js:234
ScheduleMaroctaskWithCurrentZone@zone evergreen.js:1107
(匿名)@zone everyvang.js:2985
proto.@zone evergreen.js:1428
(匿名)@http.js:2065
_trySubscribe@Observable.js:42
订阅@Observable.js:28
(匿名)@subscribeTo.js:20
subscribeToResult@subscribeToResult.js:7
_innerSub@mergeMap.js:59
_tryNext@mergeMap.js:53
_next@mergeMap.js:36
next@Subscriber.js:49
(匿名)@scalar.js:4
_trySubscribe@Observable.js:42
订阅@Observable.js:28
调用@mergeMap.js:21
订阅@Observable.js:23
调用@filter.js:13
订阅@Observable.js:23
调用@map.js:16
订阅@Observable.js:23
创建@create organime.component.ts:32
(匿名)@createOrganizameComponent.html:21
handleEvent@core.js:34789
callWithDebugContext@core.js:36407
debugHandleEvent@core.js:36043
dispatchEvent@core.js:22533
(匿名)@core.js:33721
(匿名)@platform browser.js:1789
invokeTask@zone everyver.js:391
onInvokeTask@core.js:30885
invokeTask@zone evergreen.js:390
runTask@zone everyver.js:168
invokeTask@zone evergreen.js:465
invokeTask@zone evergreen.js:1603
globalZoneAwareCallback@zone evergreen.js:1629
再显示12帧
显示:1在'http://localhost:8080/api/infotel/createOrganisme“起源”http://localhost:4200'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。
core.js:7187错误HttpErrorResponse{headers:HttpHeaders,状态:0,状态文本:“未知错误”,url:http://localhost:8080/api/infotel/createOrganisme“,ok:false,…}
以下是java后端控制器:

package com.infotel.controller;

import java.util.List;

import javax.validation.Valid;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.infotel.dto.OrganismeDTO;
import com.infotel.service.OrganismeService;

@RestController
@RequestMapping("/api/infotel")
public class Controller {

    private final OrganismeService orgService;

    public Controller(OrganismeService orgService) {
        this.orgService=orgService;
    }

    @PostMapping("/createOrganisme")
    public ResponseEntity<?> create(@RequestBody OrganismeDTO org){
        System.out.println(org.toString());
        this.orgService.create(org);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        headers.add("Access-Control-Allow-Headers", "X-Requested-With,content-type");
        headers.add("Access-Control-Allow-Credentials", "true");
        return new ResponseEntity<>(headers,HttpStatus.CREATED);
    }

    @GetMapping("/getAllOrganismes")
    public ResponseEntity<?> getAll(){
        List<OrganismeDTO> orgs = this.orgService.getAll();
        for(OrganismeDTO o : orgs) {
            System.out.println(o.toString());
        }
        HttpHeaders headers = new HttpHeaders();
        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        return new ResponseEntity<>(orgs,headers, HttpStatus.OK);
    }

}

package com.infotel.controller;
导入java.util.List;
导入javax.validation.Valid;
导入org.springframework.http.HttpHeaders;
导入org.springframework.http.HttpStatus;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.PostMapping;
导入org.springframework.web.bind.annotation.RequestBody;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
导入com.infotel.dto.organizedto;
导入com.infotel.service.organimeservice;
@RestController
@请求映射(“/api/infotel”)
公共类控制器{
私人最终组织服务或服务;
公共控制员(组织服务或服务){
this.orgService=orgService;
}
@后映射(“/createOrganisme”)
公共响应创建(@RequestBody organizedto org){
System.out.println(org.toString());
this.orgService.create(org);
HttpHeaders=新的HttpHeaders();
headers.add(“访问控制允许原点”、“*”);
添加(“访问控制允许方法”、“获取、发布、删除、放置”);
headers.add(“访问控制允许头”,“X请求的,内容类型”);
添加(“访问控制允许凭据”、“true”);
返回新的ResponseEntity(标题,HttpStatus.CREATED);
}
@GetMapping(“/getAllOrganismes”)
公众反应{
List orgs=this.orgService.getAll();
对于(Organimedo:orgs){
System.out.println(o.toString());
}
HttpHeaders=新的HttpHeaders();
headers.add(“访问控制允许原点”、“*”);
添加(“访问控制允许方法”、“获取、发布、删除、放置”);
返回新的响应属性(组织、标题、HttpStatus.OK);
}
}
下面是typescript服务:

import { Injectable } from '@angular/core';
import { Organisme } from './organisme';
import { Observable } from 'rxjs';
import { HttpClient, HttpHeaders } from '@angular/common/http';

const httpOptions = {
    headers: new HttpHeaders({ 'Content-Type': 'application/json' })
  };

@Injectable({
  providedIn: 'root'
})
export class OrganismeService {
  urlGetAll = 'http://localhost:8080/api/infotel/getAllOrganismes';
  urlCreate = 'http://localhost:8080/api/infotel/createOrganisme';

  constructor(private http: HttpClient) { }

  getOrganismes(): Observable<Organisme[]> {
    return this.http.get<Organisme[]>(this.urlGetAll);
  }

  create(org: Organisme): Observable<any>{
    httpOptions.headers.append('Access-Control-Allow-Origin', 'http://localhost:8080');
    httpOptions.headers.append('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    httpOptions.headers.append('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    httpOptions.headers.append('Access-Control-Allow-Credentials', 'true');
    return this.http.post(this.urlCreate, JSON.stringify(org), httpOptions);
  }
}

从'@angular/core'导入{Injectable};
从“/organime”导入{organime};
从“rxjs”导入{Observable};
从'@angular/common/http'导入{HttpClient,HttpHeaders};
常量httpOptions={
标题:新的HttpHeaders({'Content-Type':'application/json'})
};
@注射的({
providedIn:'根'
})
出口级组织服务{
urlGetAll=http://localhost:8080/api/infotel/getAllOrganismes';
urlCreate=http://localhost:8080/api/infotel/createOrganisme';
构造函数(私有http:HttpClient){}
getOrganimes():可观察{
返回this.http.get(this.urlGetAll);
}
创建(组织:Organime):可观察{
httpOptions.headers.append('Access-Control-Allow-Origin','http://localhost:8080');
httpOptions.headers.append('Access-Control-Allow-Methods','GET,POST,OPTIONS,PUT,PATCH,DELETE');
httpOptions.headers.append('Access-Control-Allow-headers','X-request-With,content-type');
httpOptions.headers.append('Access-Control-Allow-Credentials','true');
返回this.http.post(this.urlCreate、JSON.stringify(org)、httpOptions);
}
}
我在前面和后面都有标题,当get没有显示错误时,我得到了这个错误。
我是错过了什么还是做错了什么?

如果您需要更多信息,请询问我。

在服务器站点使用@CrossOrigin(origins=“”),这将在API级别启用CORS

package com.infotel.controller;

import java.util.List;

import javax.validation.Valid;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.infotel.dto.OrganismeDTO;
import com.infotel.service.OrganismeService;

@CrossOrigin(origins = "http://localhost:9000")
@RestController
@RequestMapping("/api/infotel")
public class Controller {

private final OrganismeService orgService;

public Controller(OrganismeService orgService) {
    this.orgService=orgService;
}

@PostMapping("/createOrganisme")
public ResponseEntity<?> create(@RequestBody OrganismeDTO org){
    System.out.println(org.toString());
    this.orgService.create(org);
    HttpHeaders headers = new HttpHeaders();
    headers.add("Access-Control-Allow-Origin", "*");
    headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
    headers.add("Access-Control-Allow-Headers", "X-Requested-With,content-type");
    headers.add("Access-Control-Allow-Credentials", "true");
    return new ResponseEntity<>(headers,HttpStatus.CREATED);
}

@GetMapping("/getAllOrganismes")
public ResponseEntity<?> getAll(){
    List<OrganismeDTO> orgs = this.orgService.getAll();
    for(OrganismeDTO o : orgs) {
        System.out.println(o.toString());
    }
    HttpHeaders headers = new HttpHeaders();
    headers.add("Access-Control-Allow-Origin", "*");
    headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
    return new ResponseEntity<>(orgs,headers, HttpStatus.OK);
}

}
package com.infotel.controller;
导入java.util.List;
导入javax.validation.Valid;
导入org.springframework.http.HttpHeaders;
导入org.springframework.http.HttpStatus;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.PostMapping;
导入org.springframework.web.bind.annotation.RequestBody;
导入org.springframework.web.bind.annotation.RequestM