其实是因为新开一个浏览器窗口(不是标签页)是会创建一个新的session id的,浏览器的session 管理机制是,
A用户打开一个窗口第一个访问服务器的时候后面会带一个参数sessionid,而这时候这个session id 是空的,
服务器通过getsession id 拿到一个空值,就会去创建一个session id 给user,然后一并response 给浏览器端用户A,
如果再次在当前窗口访问服务器,这时候浏览器就会把刚刚获得的session id 以参数的形式再传给服务器,服务器会认为是同一个会话。
而这时候如果再新开一个窗口(等于新开了一个进程,数据不能跨进程访问),这时候浏览器传给服务器端的session id 是空的。
这也就是为什么如果window.open 如果新开了一个窗口会要求再次登录的原因。
而打开一个新标签页,实际上还是在同一个窗口,因此是同一个session。
我们知道,在<a>标签中通过设置target="_blank"就可以实现打开新标签的效果。但有时候我们需要通过Javascript来打开新标签,那么怎么
实现呢?方法如下:
window.open("http://www.test.com");
或者:
window.open("http://www.test.com", "_blank"); //注意第二个参数
有人或许会觉得奇怪,window.open()不是用来打开新窗口的麽,怎么还可以打开新标签啊?其实只有在window.open()中指定了第三个属性
(即新窗口的特征)时浏览器才会打开新的窗口,在没指定第三个属性时只会在当前窗口打开新的标签(在IE中,如果要打开的URL与当前
页面URL不属于同一个主域名则打开新窗口;在Chrome中,如果window.open()函数不是被鼠标键盘事件调用的,而是页面直接调用或通过
定时器等调用的,则打开新窗口而非标签)。此外,下面适用于<a>标签的target参数同样适用于window.open()的name参数:
注意事项:
1.在IE中,如果要打开的域名和当前域名不属于同一个主域名,则会在新的窗口中打开(<a>标签也是这样)。
2. 在Chrome中,如果window.open()函数不是被鼠标键盘事件调用的,而是页面直接调用或通过定时器(包括鼠标键盘触发的定时器)等
调用的,则打开新窗口而非标签。
2.在新窗口或新标签中,window.open()的_parent和_top参数是无效的(只有在frame中时有效)。
3.framename参数可以设置为当前页面内的frame的name值、新窗口的name值,或者新标签的name值
var el = document.createElement("a");
document.body.appendChild(el);
el.href = url; //url 是你得到的连接
el.target = '_new'; //指定在新窗口打开
el.click();
document.body.removeChild(el);
最近在使用window.open时忽略了一个细节问题:window.open新打开一个窗口,但是有时却是新打开一个窗口有时打开一个新标签页。虽然对一般的需求来说,这个两种情况都无所谓,但是对于那种有强烈区分的需求来说还是要注意的。那么怎么会出现这种不同的打开情况呢,这要从window.open方法的用法和不同浏览器来区分。
1、window.open的用法容易忽视的细节
window.open方法有三个参数:
window.open(url, [name], [configuration])
其中:
- url, 为要新打开页面的url
- name,为新打开窗口的名字,可以通过此名字获取该窗口对象
- configuration,为新打开窗口的一些配置项,比如是否有菜单栏、滚动条、长高等等信息
例如,新打开一个没有菜单栏、标题栏、工具栏,但是有滚动条、状态栏、地址栏且可伸缩窗口的方法调用如下:
window.open("index.html","newWindow","menubar=0,scrollbars=1, resizable=1,status=1,titlebar=0,toolbar=0,location=1");
以上只是简要描述了window.open的方法,但是这个方法容易忽略的地方就是:新打开窗口名字可以是自定义的值,此外还可以是以下几个值,与超链接a的target属性值相同
窗口name值 | 描述 |
_blank | 默认的,在新窗口打开链接的url |
_self | 在当前窗口打开链接url |
_parent | 在父窗口打开链接url |
_top | 在顶级窗口打开url |
framename | 在指定的框架中打开链接url |
2、window.open打开新窗口还是打开新标签页
调用window.open是打开新窗口,还是打开新标签页,其实没有什么要紧关系,但是有些需求在这方面有很强的意愿时,那就得区分一下了。具体的打开什么还是根据具体情况来定的,以下结论是经过本人测试得出的,若有不正确的地方,请大家批评指正。
1、window.open(url)或者window.open(url, name),其中name为_blank
- 标准浏览器、IE9+是新标签打开链接url
- ie6-8是新窗口打开链接url
2、window.open(url, name),其中name为非_blank的其他4个值
此时会会在指定窗口或者frame打开链接url
3、window.open(url, name, configration)
只要配置了configration,所有浏览器都是新窗口打开链接url
3、使用window.open方法打开的窗口可能被拦截的替代方案
现在有些浏览器为了安全起见,可能会阻止window.open打开的链接url,不管是以标签还是以窗口打开。这时可能需要用户进行浏览器设置允许弹新页,让用户设置浏览器是极不可取的做法,尤其像电商类网站,那么有其他替代方案呢?
答案当然是有的,利用超链接打开的url是不会被拦截的可以实现这一点。具体做法是结合事件手动触发机制。下面是 HTML:模拟链接被按下,在新标签页打开页面,不使用window.open(可能被拦截) 这篇博客给的一个简单的实例,这篇文章给出的事件分发机制是针对标准浏览器的:
html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>Title</title> <script src="jquery.js"></script> <script type="text/javascript"> $(function() { $("#btn").click(function() { //var a = $('a')[0]; var a = $("<a href='http://www.apple.com' target='_blank'>Apple</a>").get(0); var e = document.createEvent('MouseEvents'); e.initEvent( 'click', true, true ); a.dispatchEvent(e); }); }); </script> </head> <body> <input type="button" value="Go to Apple" id="btn"> </body> </html>