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 不兼容 火狐和谷歌浏览器。。
//top.location.href(“....");
替换成:
top.window.location =“.....";
抱着死马当做活马医的态度试试,竟然跳转顺利了,也就是说后一种方法可以有效的关闭;
原 文章其实并没有说明不兼容的地方,实际使用的时候Firefox 我们用top.location.href的方式跳转毫无问题;
chrome 如果不切协议也不会有问题;
文章 仅作备忘记录。
匆忙出版本,留作遗留问题,后续研究具体原因
...未完待续
- Goahead 在Chrome跳转top.location.href 导致卡死问题
- Chrome中使用location.href 跳转问题
- 解决在chrome浏览器使用js的window.location.href跳转页面失败的问题
- Chrome Https访问Goahead服务器卡死问题
- 关于top.location.href在js中跳转还是在servlet中跳转
- location.href、parent.location.href、top.location.href、 window.open实现页面跳转
- location.href、parent.location.href、top.location.href、 window.open实现页面跳转
- location.href、parent.location.href、top.location.href、 window.open实现页面跳转
- location href、parent location href、top location href、window open实现页面跳转
- location.href、parent.location.href、top.location.href、 window.open实现页面跳转
- location href、parent location href、top location href、window open实现页面跳转
- js用 window.location.href跳转IE和chrome中路径url不一致问题
- window.location.href不跳转问题
- top.location.href windows.location.href
- top.location.href = window.location.href;
- top.location.href、parent.location.href
- location.href、parent.location.href、top.location.href、 window.open
- window.location.href parent.location.href top.location.href
- 题目1501:最大连续子序列乘积
- poj3624(01背包)
- 目录的相关命令
- Unity 墙遮挡人物时变为半透明
- 大数的阶乘
- Goahead 在Chrome跳转top.location.href 导致卡死问题
- 【Ogre开发】之一:Ogre sdk的安装以及示例代码的编译和运行
- UNIX环境高级编程——Linux终端设备详解
- C++智能指针
- CentOS下lvm分区简介
- HDU 1104题Remainder(bfs)
- GSON学习-台风路径json解析
- RCP获取插件目录中图像文件
- 位运算 进制转换