无法获取你的位置信息 请lol总是尝试重新连接返回后重新进入本功能

&a页面点击跳转到b页面,b页面点击浏览器的返回,回到刚才a页面到点击位置 是一般浏览器都会这样做的
但是如果你在返回时不得不给浏览器刷新那么他返回就没法回到之前点击的位置了那么我们就需要用到锚点功能了,但是很可耻的是我们没法获取到浏览器自带的返回事件
那怎么办啊?
问了群了的大牛们他们给了个思路
分为几种情况1,浏览器不清除缓存的话,你返回的页面,会自动跳回之前你点击的地方
监控返回按钮,刷新父页面
由子页面返回父页面时没有刷新父页面。
解决方法:
首先我考虑用JS去监控返回按钮事件,然后发现JS并不能监控返回按钮
然后我采用window.onpopstate的事件
&script type="text/javascript" &window.onpopstate = function (event) {if (event.state == null) {window.location.href = "prolist.aspx?type=" + type + "&categoryId=" + categoryId + "&img=" +}};//绑定事件处理函数.&history.pushState({ page: 1 });&history.pushState({ page: 2 });&history.back();&history.back();&/script&
2你把页面刷新了,或者浏览器把你页面刷新了
第一个解决方法:
让页面临时缓存一个文件到本地,其实也就是一个值让js去判断这个值是多少,自动链接到页面的某一个位置,这部份跟投锚一样
要的解决方法就是第2个但是具体怎么实现呢,我没去验证过但是理论是可以实现的,因为我找到了更好的方法去实现所有没做这个看下面的
第2个解决方法:
我看这篇文章后想到了/blog/1462994
利用浏览器的History
可以使用back(),forward(),和go()方法可以在用户的历史记录中前进和后退
window.history.back()
window.history.forward();
向后移动一页:
window.history.go(-1);
向前移动一页:
window.history.go(1);
过检查浏览器历史记录的length属性来找到历史记录堆栈中的页面总数window.history.
上面题外话哈哈。我们要用的是添加和修改history实体
自Gecko2开始引入&(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
HTML5引入了histtory.pushState()和history.replaceState()这两个方法,他们允许添加和修改history实体。同时,这些方法会和window.onpostate事件一起工作。
使用history.pushState()方法来修改referrer,这种方法可以被用在经过修改状态后而为xmlhttpRequest对象创建的http header中。这个referrer会是创建XMLHttpRequest&时document的URL。
pushState&用于向&history&添加当前页面的记录,而&replaceState&和&pushState&的用法完全一样,唯一的区别就是它用于修改当前页面在&history&中的记录。
假设http://mozilla.org/foo.html页面执行了一下JS
var stateObj = { foo: "bar" }; history.pushState(stateObj, "page 2", "bar.html");
这种方法将会使url地址栏显示http://mozilla.org/bar.html,但浏览器不会加载bar.html页面,即使这个页面存在也不会加载。
现在再次假设用户继续访问,然后点击后退。这时,url地址栏将会,http://mozilla.org/bar.html,页面会得到popstate事件(chrome),这个状态对象会包含一个stateObj的copy。这个页面看起来像foo.html。+
这时,我们再次点击后退,URL将变成http://mozilla.org/foo.html,document将得到另一个popstate事件和为null的state对象。这次的返回动作并没有改变文档的内容。(也许会过一会尝试加载&chrome)
pushState方法
pushState()有三个参数:state对象,标题(现在是被忽略,未作处理),URL(可选)。具体细节:
&&&&&&&&&state对象&&state对象是一个JavaScript对象,它关系到由pushState()方法创建出来的新的history实体。用以存储关于你所要插入到历史&记录的条目的相关信息。State对象可以是任何Json字符串。因为firefox会使用用户的硬盘来存取state对象,这个对象的最大存储空间为640k。如果大于这个数&值,则pushState()方法会抛出一个异常。如果确实需要更多的空间来存储,请使用本地存储。
&&&&&&&&&title&firefox现在回忽略这个参数,虽然它可能将来会被使用上。而现在最安全的使用方式是传一个空字符串,以防止将来的修改。或者可以传一个简短的标题来表示state
&&&&&&&&&URL&这个参数用来传递新的history实体的URL,注意浏览器将不会在调用pushState()方法后加载这个URL。但也许会过一会尝试加载这个URL。比如在用户重启了浏览器后,新的url可以不是绝对路径。如果是相对路径,那么它会相对于现有的url。新的url必须和现有的url同域,否则pushState()将抛出异常。这个参数是选填的,如果为空,则会被置为document当前的url。
某种意义上来说,调用pushState()方法很像设置了window.location = &#foo&,这两者都会创建和激活另一个关联到当前document的history实体,但pushState()另外有一些优点:
l&新的url可以是任何和当前url同域的url,相比之下,如果只设置hash,window.location会保持在同一个document。
l&如果不需要,你可以不修改url。对比而言,设置window.location = &#foo&;仅产生新的history实体,如果你当前的hash不是#foo
l&你可以将任意的数据与你的新history实体关联。使用基于hash的方法,需要将所有相关的数据编码为一个短字符串。
注意,pushState()方法不会使hashchange时间发生,即使是新旧url只是hash不同。
replaceState()方法
history.replaceState()&用起来很像pushState(),除了replaceState()是用来修改当前的history实体而不是创建一个新的。这个方法有时会很有用,当&你需要对某些用户行为作反应而更新一个state对象或者当前history实体时,可以使用它来更新state对象或者当前history实体的url。
popstate事件
当history实体被改变时,popstate事件将会发生。如果history实体是有pushState和replaceState方法产生的,popstate事件的state属性会包含一份来自history实体的state对象的拷贝
详见window.onpopstate
读取当前的state
读取现有state
当页面加载时,它可能会有一个非空的state对象。这可能发生在当页面设置一个state对象(使用pushState或者replaceState)之后用户重启了浏览器。当页面重新加载,页面将收到onload事件,但不会有popstate事件。然而,如果你读取history.state属性,将在popstate事件发生后得到这个state对象
var currentState = history.
Browsers: Tested and Working In
HTML5 Browsers
Chrome 8,9,10Firefox 4Safari 5Opera 11Safari iOS 4.3HTML4 Browsers
IE6,7,8,9Firefox 3Opera 10Safari 4Safari iOS prior to version 4.3
阅读(...) 评论()君,已阅读到文档的结尾了呢~~
基于gpsone技术的手机定位服务系统设计,gpsone定位技术,gpsone定位,定位服务 系统服务,gpsone,卫星定位系统,手机定位系统,gps定位系统,定位系统,全球定位系统
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于gpsone技术的手机定位服务系统设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口开发者必读
开发者工具
获取接口调用凭据
消息加解密
自定义菜单管理
数据统计接口
微信JS-SDK
微信小店接口
微信卡券接口
微信门店接口
微信智能接口
设备功能介绍
多客服功能
摇一摇周边
微信连Wi-Fi
出自微信公众平台开发者文档
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
关于网页授权回调域名的说明
1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加
2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:,配置以后此域名下面的页面 、
都可以进行OAuth2.0鉴权。但 、
3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
关于网页授权的两种scope的区别说明
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
关于网页授权access_token和普通access_token的区别
1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。
关于UnionID机制
1、请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.)绑定公众号后,才可利用UnionID机制来满足上述需求。
2、UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。
关于特殊场景下的静默授权
1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;
2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。
具体而言,网页授权流程分为四步:
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:
若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。
尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问
参考链接(请在微信客户端中打开此链接体验)
Scope为snsapi_base
https%3A%2F%%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_4_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
Scope为snsapi_userinfo
尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。
公众号的唯一标识
redirect_uri
授权后重定向的回调链接地址,请使用urlencode对链接进行处理
response_type
返回类型,请填写code
应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect
无论直接打开还是做页面302重定向时候,必须带此参数
下图为scope等于snsapi_userinfo时的授权页面:
用户同意授权后
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
code说明 :
code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。
获取code后,请求以下链接获取access_token:
公众号的唯一标识
公众号的appsecret
填写第一步获取的code参数
grant_type
填写为authorization_code
正确时返回的JSON数据包如下:
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
access_token
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in
access_token接口调用凭证超时时间,单位(秒)
refresh_token
用户刷新access_token
用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
用户授权的作用域,使用逗号(,)分隔
只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。
获取第二步的refresh_token后,请求以下链接获取access_token:
公众号的唯一标识
grant_type
填写为refresh_token
refresh_token
填写通过access_token获取到的refresh_token参数
正确时返回的JSON数据包如下:
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
access_token
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in
access_token接口调用凭证超时时间,单位(秒)
refresh_token
用户刷新access_token
用户唯一标识
用户授权的作用域,使用逗号(,)分隔
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
http:GET(请使用https协议)
access_token
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
用户的唯一标识
返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
正确时返回的JSON数据包如下:
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl":
"privilege":[
"PRIVILEGE1"
"PRIVILEGE2"
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
用户的唯一标识
用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
用户个人资料填写的省份
普通用户个人资料填写的城市
国家,如中国为CN
headimgurl
用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:
错误时微信会返回JSON数据包如下(示例为openid无效):
{"errcode":40003,"errmsg":" invalid openid "}
http:GET(请使用https协议)
access_token
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
用户的唯一标识
正确的Json返回结果:
{ "errcode":0,"errmsg":"ok"}
错误时的Json返回示例:
{ "errcode":40003,"errmsg":"invalid openid"}后使用快捷导航没有帐号?
只需一步,快速开始
查看: 3074|回复: 11
在线时间4 小时经验值266 最后登录注册时间帖子阅读权限50UID
大学专科, 积分 266, 距离下一级还需 134 积分
TA的每日心情怒 10:41签到天数: 3 天[LV.2]偶尔看看I
G币2 最后登录注册时间
马上注册,结交更多机友,下载更多应用,让你轻松玩转手机。
已有帐号?   下载游戏和软件,请【】进入机锋市场!
每次微信定位都显示“无法获取的你位置信息。请尝试返回后重新进入本功能”
改怎么破,搞了几天都搞不定,无论用wifi或者是4G网络都定不了位置
在线时间82 小时经验值560 最后登录注册时间帖子阅读权限60UID4207745
大学本科, 积分 560, 距离下一级还需 140 积分
该用户从未签到
G币7 最后登录注册时间
打开GPS即可
如果真的在意,何须放弃
在线时间1075 小时经验值374 最后登录注册时间帖子阅读权限50UID5305090
大学专科, 积分 374, 距离下一级还需 26 积分
TA的每日心情开心 14:30签到天数: 132 天[LV.7]常住居民III
G币48769 最后登录注册时间
我的可以!
在线时间4 小时经验值266 最后登录注册时间帖子阅读权限50UID
大学专科, 积分 266, 距离下一级还需 134 积分
TA的每日心情怒 10:41签到天数: 3 天[LV.2]偶尔看看I
G币2 最后登录注册时间
shiqinhisap 发表于
我的可以!
我的原来也可以,但后来就不行了
在线时间4 小时经验值266 最后登录注册时间帖子阅读权限50UID
大学专科, 积分 266, 距离下一级还需 134 积分
TA的每日心情怒 10:41签到天数: 3 天[LV.2]偶尔看看I
G币2 最后登录注册时间
城市隐客 发表于
打开GPS即可
本来是不打开GPS都可以定位的
在线时间82 小时经验值560 最后登录注册时间帖子阅读权限60UID4207745
大学本科, 积分 560, 距离下一级还需 140 积分
该用户从未签到
G币7 最后登录注册时间
你确定吗,我没打开不可,以前三星可以。没办法只好打开
如果真的在意,何须放弃
在线时间4 小时经验值266 最后登录注册时间帖子阅读权限50UID
大学专科, 积分 266, 距离下一级还需 134 积分
TA的每日心情怒 10:41签到天数: 3 天[LV.2]偶尔看看I
G币2 最后登录注册时间
城市隐客 发表于
你确定吗,我没打开不可,以前三星可以。没办法只好打开
肯定确定,我玩安卓几年鸟,就是mate7这么奇葩
在线时间4 小时经验值266 最后登录注册时间帖子阅读权限50UID
大学专科, 积分 266, 距离下一级还需 134 积分
TA的每日心情怒 10:41签到天数: 3 天[LV.2]偶尔看看I
G币2 最后登录注册时间
每次微信定位都显示“无法获取的你位置信息。请尝试返回后重新进入本功能”
改怎么破,搞了几天都搞不定,无论用wifi或者是4G网络都定不了位置
在线时间884 小时经验值1692 最后登录注册时间帖子阅读权限80UID555635
研究生, 积分 1692, 距离下一级还需 8 积分
TA的每日心情奋斗 09:28签到天数: 90 天[LV.6]常住居民II
G币4103 最后登录注册时间
我能啊,刚试了,GPS都没开
半生坎坷竟何成
叹无凭,遣谁听&&
无尽漂泊,何处是归程
春去秋来不惑也
心已倦,泪偷零
在线时间4 小时经验值266 最后登录注册时间帖子阅读权限50UID
大学专科, 积分 266, 距离下一级还需 134 积分
TA的每日心情怒 10:41签到天数: 3 天[LV.2]偶尔看看I
G币2 最后登录注册时间
jhcytyy 发表于
我能啊,刚试了,GPS都没开
偶尔可以~~不是经常可以~~~
Powered by21231人阅读
一道面试题(10)
最近看到一个题目,是当在浏览器中输入一个url后回车,后台发生了什么?比如输入url后,你看到了百度的首页,那么这一切是如何发生的呢?
这个问题之前、最近、我想以后肯定还会被问到,或者问到这样的题目,如果在百度框里输入查询的字符串开始,是怎么返回你需要的东西呢。
那这什么个过程呢(这个问题我在之后的博客中在写)?
网上各种的说法,不外乎这么几种
第一种简单的说呢就是这样的:
第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
第五步:重复第四步,直到找到正确的纪录。
第二种,更详细些的,英文的但相信你很容易看明白
1.enter the url to the address bar
2.a request will be sent to the DNS server based on your network configuration
3.DNS will route you to the real IP of the domain name
4.a request(with complete Http header) will be sent to the server(with 3's IP to identify)'s 80 port(suppose we don't specify another port)
5.server will search the listening ports and forward the request to the app which is listening to 80 port(let's say nginx here) or to another server(then 3's server will be like a load balancer)
6.nginx will try to match the url to its configuration and serve as an static page directly, or invoke the corresponding script intepreter(e.g PHP/Python) or other app to get the dynamic content(with DB query, or other logics)
7.a html will be sent back to browser with a complete Http response header
8.browser will parse the DOM of html using its parser
9.external resources(JS/CSS/images/flash/videos..) will be requested&in sequence(or not?)
10.for JS, it will be executed by JS engine
11.for CSS, it will be rendered by CSS engine and HTML's display will be adjusted based on the CSS(also in sequence or not?)
12.if there's an iframe in the DOM, then a separate same process will be executed from step 1-12
第三种的,
1. if requested object is in cache and is fresh, skip to #9
2.browser asks OS for server's IP address
3.OS makes a DNS lookup and replies the IP address to the browser
4.browser opens a TCP connection to server (this step is much more complex with HTTPS)
5.browser sends the HTTP request through TCP connection
6.browser receives HTTP response and may close the TCP connection, or reuse it for another request
7.browser checks if the response is a redirect (3xx result status codes), authorization request (401), error (4xx and 5xx), etc.; these are handled differently from normal responses (2xx)
8.if cacheable, response is stored in cache
9.browser decodes response (e.g. if it's gzipped)
10.browser determines what to do with response (e.g. is it a HTML page, is it an image, is it a sound clip?)
11.browser renders response, or offers a download dialog for unrecognized types
这么多种说法,基本的意思都是正确的,在笔试中直接填写也没啥问题,但是在面试中被问到的话,面试官肯定会问道一些细枝末节的,这就需要我们认真来研究了。
ok,咱们仔细的说一下整个过程吧,这里我参考一篇国外的文章,就是这个大牛的,题目是What really happens when you navigate to a URL,链接见文章最后的参考资料。
让我们开始吧,将文章翻译过来,详见参考文献4作者的翻译,2.The browser looks up the IP address for the domain name(浏览器查找域名的ip地址)导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下:浏览器缓存 –&浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。系统缓存&– 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。路由器缓存&– 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。ISP DNS 缓存&– 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。递归搜索&– 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶级服务器的匹配过程不是那么必要了。DNS递归查找如下图所示:DNS有一点令人担忧,这就是像wikipedia.org 或者 这样的整个域名看上去只是对应一个单独的IP地址。还好,有几种方法可以消除这个瓶颈:循环DNS是DNS查找时返回多个IP时的解决方案。举例来说,实际上就对应了四个IP地址。负载平衡器是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点一般都会使用这种昂贵的高性能负载平衡器。地理 DNS&根据用户所处的地理位置,通过把域名映射到多个不同的IP地址提高可扩展性。这样不同的服务器不能够更新同步状态,但映射静态内容的话非常好。Anycast是一个IP地址映射多个物理主机的路由技术。 美中不足,Anycast与TCP协议适应的不是很好,所以很少应用在那些方案中。大多数DNS服务器使用Anycast来获得高效低延迟的DNS查找。3. The browser sends a HTTP request to the web server(浏览器给web服务器发送一个HTTP请求)因为像Facebook主页这样的动态页面,打开后在浏览器缓存中很快甚至马上就会过期,毫无疑问他们不能从中读取。所以,浏览器将把一下请求发送到Facebook所在的服务器:GET / HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
User-Agent: Mozilla/4.0 ( MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Cookie: datr=-[...]; locale=en_US; lsd=WW[...]; c_user=2101[...]GET 这个请求定义了要读取的URL: “/”。 浏览器自身定义 (User-Agent&头), 和它希望接受什么类型的相应 (Acceptand&Accept-Encoding&头).&Connection头要求服务器为了后边的请求不要关闭TCP连接。请求中也包含浏览器存储的该域名的cookies。可能你已经知道,在不同页面请求当中,cookies是与跟踪一个网站状态相匹配的键值。这样cookies会存储登录用户名,服务器分配的密码和一些用户设置等。Cookies会以文本文档形式存储在客户机里,每次请求时发送给服务器。用来看原始HTTP请求及其相应的工具很多。作者比较喜欢使用fiddler,当然也有像FireBug这样其他的工具。这些软件在网站优化时会帮上很大忙。除了获取请求,还有一种是发送请求,它常在提交表单用到。发送请求通过URL传递其参数(e.g.: /puzzle.aspx?id=85)。发送请求在请求正文头之后发送其参数。像“/”中的斜杠是至关重要的。这种情况下,浏览器能安全的添加斜杠。而像“http: ///folderOrFile”这样的地址,因为浏览器不清楚folderOrFile到底是文件夹还是文件,所以不能自动添加 斜杠。这时,浏览器就不加斜杠直接访问地址,服务器会响应一个重定向,结果造成一次不必要的握手。&4.&The facebook server responds with a permanent redirect (facebook服务的永久重定向响应)图中所示为Facebook服务器发回给浏览器的响应:HTTP/1.1 301 Moved Permanently Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Sat, 01 Jan :00 GMT Location: / P3P: CP=&DSP LAW& Pragma: no-cache Set-Cookie: made_write_conn= expires=Thu, 12-Feb-:50 GMT; path=/; domain=.; httponly Content-Type: text/ charset=utf-8 X-Cnection: close Date: Fri, 12 Feb :51 GMT Content-Length: 0服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“/” 而非“/”。为什么服务器一定要重定向而不是直接发会用户想看的网页内容呢?这个问题有好多有意思的答案。其中一个原因跟搜索引擎排名有 关。你看,如果一个页面有两个地址,就像/ 和/,搜索引擎会认为它们是两个网站,结果造成每一个的搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是 什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有一个是用不同的地址会造成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几次。5.&The browser follows the redirect(浏览器跟踪重定向地址)现在,浏览器知道了“/”才是要访问的正确地址,所以它会发送另一个获取请求:GET / HTTP/1.1 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...] Accept-Language: en-US User-Agent: Mozilla/4.0 ( MSIE 8.0; Windows NT 6.1; WOW64; [...] Accept-Encoding: gzip, deflate Connection: Keep-Alive Cookie: lsd=XW[...]; c_user=21[...]; x-referer=[...] Host: 头信息以之前请求中的意义相同。6.&The server ‘handles’ the request(服务器“处理”请求)服务器接收到获取请求,然后处理并返回一个响应。这表面上看起来是一个顺向的任务,但其实这中间发生了很多有意思的东西- 就像作者博客这样简单的网站,何况像facebook那样访问量大的网站呢!Web 服务器软件web服务器软件(像IIS和阿帕奇)接收到HTTP请求,然后确定执行什么请求处理来处理它。请求处理就是一个能够读懂请求并且能生成HTML来进行响应的程序(像ASP.NET,PHP,RUBY...)。举 个最简单的例子,需求处理可以以映射网站地址结构的文件层次存储。像/folder1/page1.aspx这个地 址会映射/httpdocs/folder1/page1.aspx这个文件。web服务器软件可以设置成为地址人工的对应请求处理,这样 page1.aspx的发布地址就可以是/folder1/page1。请求处理请求处理阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并讲数据存储在服务器上。然后,需求处理会生成一个HTML响应。所 有动态网站都面临一个有意思的难点 -如何存储数据。小网站一半都会有一个SQL数据库来存储数据,存储大量数据和/或访问量大的网站不得不找一些办法把数据库分配到多台机器上。解决方案 有:sharding (基于主键值讲数据表分散到多个数据库中),复制,利用弱语义一致性的简化数据库。委 托工作给批处理是一个廉价保持数据更新的技术。举例来讲,Fackbook得及时更新新闻feed,但数据支持下的“你可能认识的人”功能只需要每晚更新 (作者猜测是这样的,改功能如何完善不得而知)。批处理作业更新会导致一些不太重要的数据陈旧,但能使数据更新耕作更快更简洁。7.&The server sends back a HTML response(服务器发回一个HTML响应)图中为服务器生成并返回的响应:HTTP/1.1 200 OK Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Sat, 01 Jan :00 GMT P3P: CP=&DSP LAW& Pragma: no-cache Content-Encoding: gzip Content-Type: text/ charset=utf-8 X-Cnection: close Transfer-Encoding: chunked Date: Fri, 12 Feb :55 GMT
2b3Tn@[...]整个响应大小为35kB,其中大部分在整理后以blob类型传输。内容编码头告诉浏览器整个响应体用gzip算法进行压缩。解压blob块后,你可以看到如下期望的HTML:&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Strict//EN&
&http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&& &html xmlns=&http://www.w3.org/1999/xhtml& xml:lang=&en& lang=&en& id=&facebook& class=& no_js&& &head& &meta http-equiv=&Content-type& content=&text/ charset=utf-8& /& &meta http-equiv=&Content-language& content=&en& /& ...关于压缩,头信息说明了是否缓存这个页面,如果缓存的话如何去做,有什么cookies要去设置(前面这个响应里没有这点)和隐私信息等等。请注意报头中把Content-type设置为“text/html”。报头让浏览器将该响应内容以HTML形式呈现,而不是以文件形式下载它。浏览器会根据报头信息决定如何解释该响应,不过同时也会考虑像URL扩展内容等其他因素。8.&The browser begins rendering the HTML(浏览器开始显示HTML)在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了:9.&The browser sends requests for objects embedded in HTML(浏览器发送获取嵌入在HTML中的对象)在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。下面是几个我们访问时需要重获取的几个URL:图片http://static.ak.fbcdn.net/rsrc.php/z12E0/hash/8q2anwu7.gifhttp://static.ak.fbcdn.net/rsrc.php/zBS5C/hash/7hwy7at6.gif…CSS 式样表http://static.ak.fbcdn.net/rsrc.php/z448Z/hash/2plh8s4n.csshttp://static.ak.fbcdn.net/rsrc.php/zANE1/hash/cvtutcee.css…JavaScript 文件http://static.ak.fbcdn.net/rsrc.php/zEMOA/hash/c8yzb6ub.jshttp://static.ak.fbcdn.net/rsrc.php/z6R9L/hash/cq2lgbs8.js…这些地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等...但 不像动态页面那样,静态文件会允许浏览器对其进行缓存。有的文件可能会不需要与服务器通讯,而从缓存中直接读取。服务器的响应中包含了静态文件保存的期限 信息,所以浏览器知道要把它们缓存多长时间。还有,每个响应都可能包含像版本号一样工作的ETag头(被请求变量的实体值),如果浏览器观察到文件的版本 ETag信息已经存在,就马上停止这个文件的传输。试着猜猜看“fbcdn.net”在地址中代表什么?聪明的答案是&Facebook内容分发网络&。Facebook利用内容分发网络(CDN)分发像图片,CSS表和JavaScript文件这些静态文件。所以,这些文件会在全球很多CDN的数据中心中留下备份。静态内容往往代表站点的带宽大小,也能通过CDN轻松的复制。通常网站会使用第三方的CDN。例如,Facebook的静态文件由最大的CDN提供商Akamai来托管。举例来讲,当你试着ping static.ak.fbcdn.net的时候,可能会从某个akamai.net服务器上获得响应。有意思的是,当你同样再ping一次的时候,响应的服务器可能就不一样,这说明幕后的负载平衡开始起作用了。10.&The browser sends further asynchronous (AJAX) requests(浏览器发送异步(AJAX)请求)在Web 2.0伟大精神的指引下,页面显示完成后客户端仍与服务器端保持着联系。以 Facebook聊天功能为例,它会持续与服务器保持联系来及时更新你那些亮亮灰灰的好友状态。为了更新这些头像亮着的好友状态,在浏览器中执行的 JavaScript代码会给服务器发送异步请求。这个异步请求发送给特定的地址,它是一个按照程式构造的获取或发送请求。还是在Facebook这个例 子中,客户端发送给/ajax/chat/buddy_list.php一个发布请求来获取你好友里哪个 在线的状态信息。提起这个模式,就必须要讲讲&AJAX&-- “异步JavaScript 和 XML”,虽然服务器为什么用XML格式来进行响应也没有个一清二白的原因。再举个例子吧,对于异步请求,Facebook会返回一些JavaScript的代码片段。除了其他,fiddler这个工具能够让你看到浏览器发送的异步请求。事实上,你不仅可以被动的做为这些请求的看客,还能主动出击修改和重新发送它们。AJAX请求这么容易被蒙,可着实让那些计分的在线游戏开发者们郁闷的了。(当然,可别那样骗人家~)Facebook聊天功能提供了关于AJAX一个有意思的问题案例:把数据从服务器端推送到客户端。因为HTTP是一个请求-响应协议,所以聊天服务器不能把新消息发给客户。取而代之的是客户端不得不隔几秒就轮询下服务器端看自己有没有新消息。这些情况发生时长轮询是个减轻服务器负载挺有趣的技术。如果当被轮询时服务器没有新消息,它就不理这个客户端。而当尚未超时的情况下收到了该客户的新消息,服务器就会找到未完成的请求,把新消息做为响应返回给客户端。
OK,到这里我们知道了从输入URL开始后,到请求页面返回的详细过程了。你要是能够达到这种程度,我想面试官会向你投去offer的目光!哈哈。
参考资料:
1./questions/2092527/what-happens-when-you-type-in-a-url-in-browser;
4. 当你输入一个网址的时候,实际会发生什么?
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:259201次
积分:3072
积分:3072
排名:第8178名
原创:80篇
转载:63篇
评论:68条
曾是中科院计算所一名小硕,目前在人人的在线教育组,喜欢技术,熟悉移动app服务端底层开发
我的技术博客:
(1)(1)(1)(8)(4)(18)(23)(37)(37)(1)(5)(1)(3)(3)}

我要回帖

更多关于 lol一直尝试重新连接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信