预检响应在角度发布请求上具有无效的 HTTP 状态代码 403

Posted

技术标签:

【中文标题】预检响应在角度发布请求上具有无效的 HTTP 状态代码 403【英文标题】:Response for preflight has invalid HTTP status code 403 on angular post request 【发布时间】:2017-01-28 04:45:07 【问题描述】:

我的本​​地主机中有一个 $http 请求,它正在调用某个 api 的 url。我在执行调用时遇到错误

Response for preflight has invalid HTTP status code 403

我可以使用 Angular 做任何事情来解决这个问题吗?我有 chrome 的 CROS 插件允许跨域请求

$http(
                method: 'POST',
                url: url,
                data:data1,
                headers: 
                    'Access-Control-Allow-Origin': '*',                 
                
            )

【问题讨论】:

服务器端脚本是什么? 403 被禁止访问... 服务器端脚本/代码需要在其代码中添加允许来源。 服务器端是 java 但我对此无能为力 可能的解决方案***.com/questions/47082492/… 【参考方案1】:

如果你使用 java restful 控制器作为你的服务器。 可以参考https://spring.io/guides/gs/rest-service-cors/

我在我的控制器上添加了 @CrossOrigin(origins = "*") 并且它可以工作。 基本上,你不能在客户端做任何事情。

【讨论】:

这对我有用。长期在 Java 代码中的控制器方法上保留此注释有什么风险吗?【参考方案2】:

好的,这就是我的想法。这一切都与 CORS 政策有关。在 POST 请求之前,Chrome 正在执行预检 OPTIONS 请求,该请求应在实际请求之前由服务器处理和确认。现在,对于这样一个简单的服务器,这真的不是我想要的。因此,重置标头客户端会阻止预检:

app.config(function ($httpProvider) 
  $httpProvider.defaults.headers.common = ;
  $httpProvider.defaults.headers.post = ;
  $httpProvider.defaults.headers.put = ;
  $httpProvider.defaults.headers.patch = ;
);

浏览器现在将直接发送 POST。希望这可以帮助很多人......我真正的问题是对 CORS 的了解不够。

链接到一个很好的解释:http://www.html5rocks.com/en/tutorials/cors/

感谢这个答案为我指明了方向。 AngularJS POST Fails: Response for preflight has invalid HTTP status code 404

【讨论】:

有这样的解决方案可以在 jQuery 中使用吗? 如何在 Angular2 中做到这一点?【参考方案3】:

我在 angularjs 中有这段代码:

$http.post('http://localhost:8080/employee/'
        , $scope.alumno
        ,headers: 'Content-Type': 'application/json'
        ).success(function(data)

            if ( data.err === false ) 
                $scope.actualizado = true;

                setTimeout(function() 
                    $scope.actualizado = false;
                    $scope.$apply();
                , 3500);

            ;
        );

我的 API 有这些数据:

//Add employee:
Url: http://localhost:8080/employee
Type request: POST
Add a new employee:

 "firstName": "Javier",
 "lastName": "Piedra",
`

我使用带有扩展名的 chrone 来获得可用的 CORS 的 GET 非常完美,但发布示例此错误:

XMLHttpRequest cannot load http://localhost:8080/employee/. Response for 
preflight has invalid HTTP status code 403

在我的 app.config 中使用:

app.config( function($routeProvider,$httpProvider)

$httpProvider.defaults.headers.common = ;
$httpProvider.defaults.headers.post = ;
$httpProvider.defaults.headers.put = ;
$httpProvider.defaults.headers.patch = ;

也许这可以解决您的问题。

问候

【讨论】:

如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review 谢谢。我不能问:您已达到问题限制。问候

以上是关于预检响应在角度发布请求上具有无效的 HTTP 状态代码 403的主要内容,如果未能解决你的问题,请参考以下文章

预检响应具有无效的 HTTP 状态代码:401 角度

预检响应具有无效的 HTTP 状态代码 404”

预检的 Wcf webHttpBinding 响应具有无效的 HTTP 状态代码 400

CORS 问题:预检响应具有无效的 HTTP 状态代码 403

Angular 5:预检响应具有无效的 HTTP 状态代码 403

预检响应具有无效的 HTTP 状态代码 401 - Spring