问题描述:
在IE11下,通过Forms身份认证登录某个网站后,该网站返回的Cookie无法保存,导致每次刷新或关闭浏览器后都需要重新登录。
问题分析:
这个问题的根本原因在于IE11对于跨域能力(CORS)的实现。跨域的本质是在浏览器端发送一次Options请求并且在响应头中带上Access-Control-Allow-Credentials: true来开启跨域的Cookie传输。但是IE11在接收到带有Access-Control-Allow-Credentials: true响应头的Options请求时有缓存,这会使得后续的身份认证请求无法直接带上Cookie,因而Cookies无法保存,每次重新发起登录请求时都会去后台验证,造成了用户的登录体验不良。
问题解决:
1.使用P3P头信息
由于IE11的这个缓存行为是由于安全限制造成的,可以通过在服务器端返回P3P头信息让IE11不再做限制。P3P是Platform for Privacy Preferences的缩写,主要用于描述网站的隐私政策,IE浏览器可以识别并进行处理。网站返回的P3P头信息可以让IE浏览器相信他们之间有一个隐私协议。样例如下:
P3P: CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
2.将跨域请求合并为同域请求
通过将跨域请求合并为同域请求的方式来规避跨域问题,有以下两种方案:
- JSONP:将获取Cookie的子域名封装为一个接口,返回一个JS脚本,并且脚本内容中包含获取到的Cookie值,然后在页面上动态添加一个script标签即可。
- 代理转发:由于同域请求不会带上Cookie,因此可以在同一个域下创建一个代理接口,由后台发送请求获取Cookie,再将获取到的结果返回给前端。这种方式也可以通过Nginx的proxy_pass来实现。
总结:
由于IE11下面的同跨域问题比较复杂,以上两种方案仅仅是其中两种解决方案,实际上,还有一些其他更加细致的解决方案可以被使用。开发者在开发同应用于IE11的时候,是需要特别关注IE11对于同跨域能力的实现细节,以便能够及时地解决任何出现的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Forms身份认证在IE11下无法保存Cookie的问题 - Python技术站