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

aij0ehis  于 2023-08-01  发布在  Go
关注(0)|答案(3)|浏览(216)

我有一个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)第一次不发送OPTIONS?

5q4ezhmt

5q4ezhmt1#

Chrome(或任何其他浏览器)是否发送OPTIONS请求完全由CORS specfication指定:
调用跨域请求算法时,必须遵循以下步骤:
...
2.如果以下条件为真,则遵循简单的跨域请求算法:

  • 请求方法是一种简单的方法,强制预检标志未设置。
  • 每个作者请求标头都是简单标头或作者请求标头为空。

3.否则,使用preflight算法跟踪跨域请求。

  • 注意:使用简单方法的跨域请求,如果作者请求头不简单,则会有一个preflight请求,以确保资源可以处理这些头。(类似于使用不是简单方法的方法的请求。)*

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

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

字符串
这意味着你的Angular应用已经插入了非简单的Authorization请求头,可能是作为身份验证方案的一部分。非简单的“作者请求头”触发OPTIONS请求,正如您在上面的引用中所看到的。
为了让请求成功,您的服务器应该处理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

x759pob2

x759pob22#

当您第一次登录时,您很可能在登录过程中的某个地方设置了Authorization HTTP头。另一方面,您忘记在用户注销时删除此头。
当您尝试再次登录时,Authorization HTTP标头仍然存在。这会触发浏览器执行预检请求(请参阅Rob W的说明:https://stackoverflow.com/a/27924344/548020。考虑到您尝试使用授权类型的密码登录,发送Authorization头没有意义,因为这意味着您已经获得授权(=登录)。你基本上是要求你的后端登录,同时告诉你的后端,你已经授权(=登录)。
这可以通过简单的在用户注销时删除Authorization HTTP头来解决。

z9smfwbn

z9smfwbn3#

您也可以在登录时清理Headers,然后再发送POST请求:
第一个月

相关问题