Goahead 在Chrome跳转top.location.href 导致卡死问题

来源:互联网 发布:剑三捏脸数据截图 编辑:程序博客网 时间:2024/05/18 13:24

使用跳转的背景:

假设主界面只有一个main.asp,剩下的是iframe的方式层层嵌套

<td><iframe name="info" id="info" width="100%" height="100%" src="info.asp" frameborder="0"></iframe></td>

备注:(地址栏输入ip后直接跳转到某个asp网页是通过修改goahead 的redirec函数可以搞定)

指定特定界面使用https

可尝试方案:

1.保存好serverip

获取ip的方法比较多样,server传回,或者本地parse url 获取都可以,此处不扩展;

var http_url = "http://"+serverip +"/index.asp";

var https_url = "https://"+serverip +"/index.asp"

2. 使用跳转

//top.location.href = home_https_url; 
top.window.location = home_https_url;


为什么使用了第二种方式?

我们和其他项目组用了同样的goahead版本,同样的asp跳转方式top.location.href = home_https_url; 

问题:

我们的server 适配了三种浏览器 chrome Firefox IE8+(没有使用JQuery等框架,对我们来说真的是一种煎熬,纯js脚本进行适配,问题很多很杂)

1. 在chrome 首次打开浏览器切到https网页的时候,会卡在某个请求,页面没有完整刷新,也不再发请求;点击浏览器空白页签栏处或者最小化后再放大等重新聚焦动作,浏览器会继续发起请求,完成剩余页面资源的获取;

从wireshark抓网络数据包来看,没有发生网络交互的异常,就是chrome 无故停止了继续拉取资源

 1)只有chrome浏览器会有这个问题,其他浏览器不会出现

 2)同样的server代码;同样的跳转方式,别的项目组却没有出现这个问题;资源限制没办法通过网络包方式定位,至今没有搞清楚差别在哪里;

       区别的地方是页面的请求资源数量不同;


分析过程:

用 wireshark抓包后发现,https的某一个交互帧,正常情况应该正常的,

没有资源请求时总是三路握手,https hello  然后由客户端发起挥手,然后四路挥手后结束

在top.location.href = home_https_url; 跳转的时候,客户端没有挥手动作,直接开始了http 的asp页面请求;

服务器阻塞方式,导致Goahead 服务器卡死;


增加了一个socket超时;(goahead是2.1.8)修改如下:

-----------------------------------

websSSL.cpp 

sslListenSock = socketOpenConnection(NULL, SSL_PORT, websSSLAccept, SOCKET_BLOCK);  //使用阻塞IO的方式

这会导致如果浏览器崩溃等问题出现时,服务器直接卡死;

在sockGen.cpp中:

int socketOpenConnection(char *host, int port, socketAccept_t accept, int flags)

{

  socket()之后,bind()之前,添加:

... ...

struct timeval tv = {30, 0};//设置超时时间30s.  setsockopt()函数可以做很多网络设置,做网络通讯有必要多看看

setsockopt(sp->sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
setsockopt(sp->sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

... ...

}

-----------------------------------

但是这样的效果编程切换界面需要等30s, 是无法接受的

改成1s 倒是可以解决这个问题;但是,当网络状况不好的时候,如果总是1s延时,用户将永远无法请求到资源打开网页;

设置多少合适?在页面跳转速度和网络时延 之间是没有一个平衡时间点的;https下,时延可能会十几秒,但是界面正常跳转的时候,几秒延时都不能容许;

解决方案:

1. 将服务器修改为非阻塞处理方式

2. 能让Chrome浏览器在跳转的时候发出挥手指令


搜了很多没找到匹配的处理方式,貌似别人没有用我们这么奇葩的界面处理方式(只有部分功能https时,重定位全页面为https请求)

无意中搜到这样一个

-----------------------------------------------http://blog.csdn.net/CsethCRM/article/details/7104791

 

top.location.href 不兼容 火狐和谷歌浏览器。。

分类: JavaScript 982人阅读 评论(0) 收藏 举报
浏览器

 //top.location.href(“....");

替换成:

top.window.location =“.....";

--------------------------------------------

抱着死马当做活马医的态度试试,竟然跳转顺利了,也就是说后一种方法可以有效的关闭;

原 文章其实并没有说明不兼容的地方,实际使用的时候Firefox 我们用top.location.href的方式跳转毫无问题;

chrome 如果不切协议也不会有问题;


文章 仅作备忘记录。

匆忙出版本,留作遗留问题,后续研究具体原因


...未完待续