当前位置: 首页 > 知识库问答 >
问题:

YI2和reactjs CORS筛选器给出错误:预飞行的响应具有无效的HTTP状态代码401

周麒
2023-03-14

我正在尝试使用reactJs中的ajax请求来获取一个需要从YI2中的承载身份验证的资源。

请求标头

accept:/
accept-encoding:gzip,deflate,sdch,br
access-control-request-headers:authorization
access-control-request-method:get
access-control-request-method:keep-alive
主机:localhost
来源:http://localhost:8110
引用:http://localhost:8110/
用户代理:mozilla/5.0(x11;Linux

响应标头

access-control-allow-credentials:true
access-control-allow-headers:authorization
access-control-allow-methods:GET,POST,PUT,options
access-control-allow-origin:http://localhost:8110
connection:keep-alive
content-length:150
content-type:application/json;charset=UTF-8
日期:Fri,21 Apr 2017 10:36:27 GMT
Keep-alive:Timeout=5,Max=99
服务器:Apache/2.4.25(Ubuntu)
www.authenticate:barer realm=“API”

这是我在YI2框架中的行为方法

public function behaviors()
  {
        $behaviors = parent::behaviors();
        unset($behaviors['authenticator']);
        return [
                [
                    'class' => 'yii\filters\ContentNegotiator',
                    'only' => ['view', 'index', 'filters', 'slug', 'shortlist'],  // in a controller
                    // if in a module, use the following IDs for user actions
                    'formats' => [
                        'application/json' => Response::FORMAT_JSON,
                    ],
                ],
                'corsFilter' => [
                    'class' => \yii\filters\Cors::className(),
                    'cors' => [
                        'Origin' => ['*'],
                        'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'OPTIONS'],
                        'Access-Control-Request-Headers' => ['*'],
                        'Access-Control-Allow-Credentials' => true,
                        ],
                ],
                'authenticator' => [
                        'class' => \yii\filters\auth\HttpBearerAuth::className(),
                        'except' => ['options'],
                ],
        ];
  }

我知道这个问题与CORS有关,因为相同的请求与Postman和cURL(来自terminal)使用相同的令牌可以很好地工作,reactjs和ajax显示相同的错误。

共有1个答案

轩辕鸿
2023-03-14

你的错误在于:

'except' => ['options'],

类“HttpBearerAuth”继承了YII\Base\ActionFilter,根据文档,该公共属性“$Except”定义了一个“不应应用此筛选器的操作ID列表”。而不是http方法。因此,以上所述将不包括来自“authenticator”的预飞行请求,而是对actionOptions()的请求,而这并不是您想要的。

您应该做的是避免为一个OPTIONS http请求返回401 http错误(这会导致您的错误),而只返回一个200空的响应。您可以通过添加以下内容来完成此操作:

public function beforeAction($action)
{
    //your code

    if (Yii::$app->getRequest()->getMethod() === 'OPTIONS') {
        parent::beforeAction($action);
        Yii::$app->getResponse()->getHeaders()->set('Content-Type', 'text/plain');
        Yii::$app->end();
    }

    return parent::beforeAction($action);
}
 类似资料:
  • 我正在尝试使用Ajax进行REST调用(POST)。这是我的AJAX代码 最初,我得到了这个错误:XMLHttpRequest无法加载http://localhost:port/service/myservice。对preflight请求的响应未通过访问控制检查:请求的资源上没有“access-control-allow-origin”标头。因此不允许访问源“null”。响应的HTTP状态代码为4

  • 我使用作为服务器端的Spring-boot并提供一个虚拟服务进行测试 其中我的serviceCaller.java=

  • 我知道有很多这样的问题,但我见过没有一个能解决我的问题。我已经使用了至少3个微框架。它们在执行一个简单的POST时都失败了,该POST应该返回数据: angularJS客户端: SlimPHP服务器: 我已经启用了CORS,并获得了工作请求。html使用服务器发送的JSON内容进行更新。然而我得到了一个 每次我试着用POST。为什么?

  • 问题内容: 大家。我是Angular 2和Spring框架的新手。我正在尝试使用授权标头(基本auth)进行简单的get请求。 我正在使用Spring Boot(1.2.6.RELEASE),这也可能是相关的。我的CORS配置如下所示。 这是客户端的外观 我不断得到: XMLHttpRequest无法加载 http:// localhost:8080 / api / login?username

  • 我知道这里已经有很多相同的解决问题, 但不幸的是,它们都没有帮助我:-( 这里是我的问题: 我尝试从本地主机连接到服务器上的REST服务。使用FF REST插件可以正常工作,但我的应用程序会导致以下错误: 选项 http://.../my_REST_Service/ 401 (未经授权) XMLHttpRequest 无法加载 http://.../my_REST_Service/。 印前检查的响

  • 问题内容: 我知道有很多这样的问题,但是我所见的问题都没有解决。我已经使用了至少3个微框架。所有这些都无法执行简单的POST,它应该将数据返回: angularJS客户端: SlimPHP服务器: 我已启用CORS,并且GET请求有效。html使用服务器发送的JSON内容进行更新。但是我得到了 XMLHttpRequest无法加载 http:// localhost:8080 / server.p