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

Chrome浏览器如何决定何时发送选项?

束福
2023-03-14

我有一个AngularJS WebAPI应用程序。

据我所知,OPTIONS请求是由浏览器自动构建的。

POST http://localhost:3048/Token HTTP/1.1
Host: localhost:3048
Connection: keep-alive
Content-Length: 78
Accept: application/json, text/plain, */*
Origin: http://localhost:2757
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:2757/Auth/login
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8

grant_type=password&username=xxx%40live.com&password=xxx

答复:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 971
Content-Type: application/json;charset=UTF-8
Expires: -1
Server: Microsoft-IIS/8.0
Access-Control-Allow-Origin: *
Set-Cookie: .AspNet.Cookies=CpvxrR1gPFNs0vP8GAmcUt0EiKuEzLS1stLl-70O93wsipJkLUZuNdwC8tZc5M0o1ifoCjvnRXKjEBk3nLRbFlbldJLydW2BWonr5JmBjRjXZyKtcc29ggAVhZlc2E-3gGDlyoZLAa5Et8zrAokl8vsSoXmHnsjrxZw0VecB_Ry98Ln84UuKdeHlwSBnfaKKJfsN-u3Rsm6MoEfBO5aAFEekhVBWytrYDx5ks-iVok3TjJgaPc5ex53kp7qrtH3izbjT7HtnrsYYtcfPtmsxbCXBkX4ssCBthIl-NsN2wObyoEqHMpFEf1E9sB86PJhTCySEJoeUJ5u3juTnPlQnHsk1UTcO0tDb39g-_BD-I4FWS5GMwxLNtmut3Ynjir0GndwqsvpEsLls1Y4Pq7UuVCTn7DMO4seb64Sy8oEYkKZYk9tU4tsJuGD2CAIhdSc-lAmTAA78J5NOx23klkiuSe_SSiiZo5uRpas_1CFHjhi1c8ItEMpgeTsvgTkxafq5EOIWKPRxEHbCE8Dv106k5GlKK5BaH6z7ESg5BHPBvY8; path=/; HttpOnly
X-SourceFiles: =?UTF-8?B?QzpcR1xhYmlsaXRlc3Qtc2VydmVyXFdlYlJvbGVcVG9rZW4=?=
X-Powered-By: ASP.NET
Date: Tue, 13 Jan 2015 04:54:55 GMT

{"access_token":"TkJ2trqT ....

现在登录

我注销,这只不过是删除令牌并再次登录。发生了一些不同的事情。以前它没有发送选项,但现在它发送了。以前的请求/响应是否会影响浏览器在我第二次登录时的不同行为?

OPTIONS http://localhost:3048/Token HTTP/1.1
Host: localhost:3048
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:2757
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Access-Control-Request-Headers: accept, authorization, content-type
Accept: */*
Referer: http://localhost:2757/Auth/login
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

答复:

HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 34
Content-Type: application/json;charset=UTF-8
Expires: -1
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?QzpcR1xhYmlsaXRlc3Qtc2VydmVyXFdlYlJvbGVcVG9rZW4=?=
X-Powered-By: ASP.NET
Date: Tue, 13 Jan 2015 04:56:32 GMT

{"error":"unsupported_grant_type"}

如果我重新设置浏览器并重新加载页面,它会返回到以前的状态,第一次不发送选项,我就可以登录了。

可能我需要更改服务器上的某些内容,以便它处理选项。

但是为什么我的浏览器(Chrome)第一次不发送选项呢?

共有3个答案

马涵蓄
2023-03-14

在发送POST请求之前,您还可以在登录时清理Headers:

删除$http。默认值。标题。普通[“授权”]

祁宝
2023-03-14

首次登录时,您很可能在登录过程中的某个位置设置了授权HTTP头。另一方面,当用户注销时,您忘记删除此标头。

当您再次尝试登录时,授权HTTP头仍然存在。这将触发浏览器执行飞行前请求(请参阅Rob W的说明:https://stackoverflow.com/a/27924344/548020. 考虑到您尝试使用授权类型密码登录,发送授权标题没有意义,因为这意味着您已经获得授权(=登录)。您基本上是要求后端登录,同时告诉后端您已经获得授权(=登录)。

这可以通过在用户注销时简单地删除AuthorationHTTP标头来修复。

何建中
2023-03-14

Chrome(或任何其他浏览器)是否发送选项请求完全由CORS规范指定:

调用跨源请求算法时,必须遵循以下步骤:2。如果以下条件为真,请遵循简单的跨原点请求算法:

>

  • 请求方法是一个简单的方法,并且取消了强制预飞行标志。

    每个作者请求标头都是一个简单标头,或者作者请求标头是空的。

    3.

    您的OPTIONS请求包含以下请求头:

    Access-Control-Request-Headers: accept, authorization, content-type

    这意味着你的Angular应用已经插入了非简单的授权请求标头,可能是身份验证方案的一部分。非简单的"作者请求标头"触发OPTIONS请求,正如您在上面的引用中看到的。

    要使请求成功,您的服务器应处理选项请求并响应:

    Access-Control-Allow-Origin: https://example.com
    Access-Control-Allow-Headers: authorization
    

    要了解有关CORS的更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS.

  •  类似资料:
    • 问题内容: 我想在我正在使用的Web应用程序上测试一些URL。为此,我想手动创建HTTP POST请求(这意味着我可以添加我喜欢的任何参数)。 我缺少Chrome和/或Firefox中的任何扩展程序或功能吗? 问题答案: 我一直在为这种类型的东西制作一个名为Postman的Chrome应用。所有其他扩展似乎都过时了,所以我自己做了。它还具有许多其他功能,这些功能有助于在此处记录我们自己的API。

    • 在过去的几个小时里,我一直在阅读推送通知应用编程接口和网络通知应用编程接口。我还发现谷歌 我试图了解我们是否可以使用桌面通知实现对浏览器的推送通知,我相信这就是Web通知API所做的。我在这里看到了一个关于如何为Chrome做到这一点的谷歌文档 现在我还不明白的是: 我们可以使用GCM/APNS向包括Firefox在内的所有Web浏览器发送推送通知吗 我相信所有这些答案都可以帮助很多有类似困惑的人

    • 问题内容: 我正在使用selenium,黄瓜和java进行自动化测试。 我需要在chrome浏览器中安装插件才能打开我的应用程序。我已经安装了这个插件。但是,当我通过selenium打开chrome浏览器时,此插件丢失,应用程序无法正常工作。 每次打开浏览器时如何安装插件? 问题答案: 我正在使用 Chrome 65.0 和 Selenium 3.11.0 脚步 : 在Chrome中运行以下网址:

    • 问题内容: 我需要一些返回布尔值的函数来检查浏览器是否为Chrome。 如何创建此类功能? 问题答案: 更新:以获取更新的处理方式。以下答案可能仍然有效,但可能会在其他浏览器中引发误报。 但是,如前所述,用户代理可以被欺骗,因此在处理这些问题时总是最好使用功能检测,如其他答案所述。

    • 我已经实现了一个使用基本身份验证(使用Spring Security性)的web服务器。 我在访问URL时禁用了默认身份验证入口点(它只返回401,而不是用www身份验证标头响应401),目的是防止浏览器显示身份验证弹出窗口。 我能够用javascript代码和命令行工具(如curl)连接到服务器,但是当我用浏览器(chrome)测试它时 <代码>curl-v-u用户:密码本地主机:8080/用户

    • 我似乎无法正确配置系统,也无法让浏览器向Web服务器发送kerberos票据。而是发送令牌。 问:我该如何解决这个问题? 下面列出了所有细节和配置。 null 这就是我在中以编程方式注册配置的方式: 和 编辑1:附加信息 我已经下载了Kerberos Authentication Tester工具,当从服务器()运行它并对进行测试时,它显示了正确的身份验证。 当从服务器(浏览器所在)运行它时,它表