今天同事问一个比较奇怪的问题。我们这边的项目中,有个地址,要单点到客户的系统中,具体什么不用做,只需要跳转到客户处理单点的一个链接就行,链接地址类似于这样: http://ip/ssoLogin.jsp...
我们的前端那就好做了呀,直接window.open(url),不就大功告成了么,这大概是我最近见过的最简单的一个需求了……
接下来问题就来了,同事加完之后发现,只要用window.open跳转过去的,必然会页面显示404,而跳转之后,在那个404页面当前页面一刷新,就成功连上成功单点了。
于是,,,接下来我们几个人进入了挠头的阶段,不知道从何定位。
开始怀疑是带过去的cookie问题,但是对比了404和成功的页面get请求,发现cookie是一样的。
然后就重头开始,仔细思考起了这个现象。从我们的系统跳转过去不行,从当前页刷新或者新开一个页签都行。对比请求头,找到了个参数——referer,直接页面中刷新进,是不会有referer这个参数的,从我们的系统进,就会带着我们系统的服务器地址。
查了下MDN:
Referer
请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer
请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
以上述推断,客户的这个ssoLogin,应该是对请求来源页做了什么处理。决定就从它下手,找什么办法可以跳过referer。
MDN中:
在以下两种情况下,Referer
不会被发送:
- 来源页面采用的协议为表示本地文件的 "file" 或者 "data" URI;
-
当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS)。
这个问题在IE里面没有出现,因为IE不会带上referer
我们试了下从其他来源查到的方法:
方法一(已试,有效):
这个大致是,location.replace也不会记录referer
window.open('javascript:window.name;', '<script>location.replace("'+url+'")<\/script>');
方法二:
<meta name="referrer" content="never">
方法三:
利用a标签的属性:rel
(摘自HTML standard)
<!-- 这两种写法应该都可 -->
<a href="..." rel="noreferrer" target="_blank">
<a href="..." rel="noreferrer noopener" target="_blank">
这几种,第一种已测,其他两种待测,等下个fiddler测完再补充
贴上参考链接:
https://html.spec.whatwg.org/multipage/links.html#link-type-noreferrer