禁止PutMapping 403

时间:2019-07-05 15:15:14

标签: angular spring controller put

我正在尝试使用“ put”动词使用http协议进行一次更新,但是我被403禁止使用“请求方法:chrome中的选项”。

如果我尝试将动词从PUT更改为POST,那么它会起作用。

这是我的服务器代码(春季)

    @PutMapping("/path")
    public ResponseEntity putMethod(@RequestBody Dto dto) throws URISyntaxException {
        log.debug("put is called");

        return ResponseEntity.ok().build();
    }

这里是我的角度代码

update(dto: dto) {
    return this.http
      .put<Dto>(this.resourceUrl + '/path', dto, { observe: 'response' })
      .pipe();
  }

如果我更改了角度,并且弹簧日志被正确书写,但是我需要进行更新,我想使用正确的动词

Chrome日志

 Request URL: http://localhost:9080/path
Request Method: OPTIONS
Status Code: 403 Forbidden
Remote Address: 127.0.0.1:9080
Referrer Policy: no-referrer-when-downgrade
Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
Connection: Close
Content-Language: it-IT
Content-Length: 20
Date: Fri, 05 Jul 2019 15:19:14 GMT
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
X-Powered-By: Servlet/3.1
Provisional headers are shown
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: PUT
Origin: http://localhost:4200
Referer: http://localhost:4200/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36

这是我的Java帖子映射

@PostMapping("/path")
public ResponseEntity postMethod(@RequestBody Dto dto) throws URISyntaxException {
    log.debug("post is called");

    return ResponseEntity.ok().build();
}

和角度邮政编码

post(dto: dto) {
    return this.http
      .post<Dto>(this.resourceUrl + '/path', dto, { observe: 'response' })
      .pipe();
  }

在Chrome日志中用于发布请求(工作)

Request URL: http://localhost:9080/path
Request Method: POST
Status Code: 200 OK
Remote Address: 127.0.0.1:9080
Referrer Policy: no-referrer-when-downgrade
Access-Control-Allow-Origin: *
Content-Language: it-IT
Content-Length: 16
Content-Type: application/json;charset=UTF-8
Date: Fri, 05 Jul 2019 15:48:01 GMT
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
X-Powered-By: Servlet/3.1
Provisional headers are shown
Accept: application/json, text/plain, */*
Content-Type: application/json
Origin: http://localhost:4200
Referer: http://localhost:4200/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36

3 个答案:

答案 0 :(得分:0)

后端服务器中是否允许使用动词PUT?我看不到前端方面的任何问题。

答案 1 :(得分:0)

我看到您正在从9090调用在4200上运行的API,您可能会得到显示Access control allow origin错误的镶边日志。

如果这是您需要的,则可能必须允许您的出身。里面会有安全隐患。因此,您在执行此操作时必须谨慎。

添加CrossOrigin将允许此流程。

@CrossOrigin(origins = "http://localhost:4200")
@PutMapping("/path")

https://spring.io/guides/gs/rest-service-cors/

答案 2 :(得分:0)

最后,我在我的dev application.properties中使用了以下设置:

cors.allowed-origins=*
cors.allowed-methods=*
cors.allowed-headers=*
cors.exposed-headers=Authorization,Link,X-Total-Count
cors.allow-credentials=true

因为在开发环境中,我使用位于localhost:4200的节点服务器,所以在生产环境中我向localhost:9080发出http请求,而angular和java在同一端口(设置了maven-war-plugin和webResources)在同一服务器上不需要此设置。