这几个问题很常见,所以mark一下,往后再详细展开说。
在浏览器地址栏键入URL,按下回车之后经历的流程/ 常见状态码/ get请求和post请求的区别/ Cookie和Session的区别
1.DNS解析:浏览器会根据URL逐层查询DNS服务器缓存解析URL中的域名所对应的IP地址(DNS缓存从近到远依次是浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,从哪个缓存查找到对应IP则直接返回不再查找后面的缓存 2.TCP连接 (找到IP地址和对应端口后与服务器建立TCP连接)(三次握手) 3.浏览器发送HTTP请求 4.服务器对浏览器请求做出响应并把对应带有html文本的HTTP响应报文发送给浏览器 5.浏览器收到html并在浏览器解析进行渲染页面 6.浏览器释放TCP连接(四次挥手) (最后一步和倒数第二步可以同时发生,哪一步在前没有要求)
详细流程可见这里:
(状态码由三位数字构成第一位表示状态码类型)
五种可能的取值类型 1xx:指示信息–表示请求已接收,继续处理 2xx:成功–表示请求已被成功接收、理解、接受 3xx:重定向–要完成请求必须进行更进一步的操作 4xx:客户端错误–请求有语法错误或请求无法实现 5xx:服务器端错误–服务器未能实现合法的请求
常见状态码
2000K:正常返回信息 400 Bad Request:客户端请求有语法错误,不能被服务器所理解 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate 报头域一起使用 403 Forbidden:服务器收到请求,但是拒绝提供服务eg:比如IP被禁了 404Not Found:请求资源不存在,eg,输入了错误的URL 500Internal Server Error:服务器发生不可预期的错误 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常 521 :爬虫自己遇到的没有携带js执行返回的cookie
详细的解释在这里
简短的来说,要从三个层面回答
Http报文层面:GET将请求信息放在URL,POST放在报文体中 数据库层面: GET符合幂等性(幂等性:对数据库的一次操作和多次操作的结果是一致的)和安全性(安全性:对数据的操作没有改变数据库的数据) (这时因为Get请求一般是做查询操作的) POST不符合幂等性和安全性(POST一般是作用在上一级url上的,每次请求都会添加一份新资源,因此不符合幂等)(POST一般是往数据提交数据改变数据库,不符合安全性) 其他层面: Get请求携带参数有限,POST可以携带更多数据; GET可以被缓存、被存储(会保存在浏览器的浏览记录中,url可以保存为浏览器书签),而POST不行
详细内容点我
HTTP本身是无连接的,正常我们每次请求数据都要重新建立携带数据连接(如登录),但是这样相当麻烦,因此我们引入了某些机制让HTTP具备状态,其中两个便是cookie,session.
Cookie简介 在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
Cookie是客户端的解决方案 是由服务器发给客户端的特殊信息,以文本的形式存放在客户端 客户端再次请求的时候,会把Cookie回发 服务器接收到后,会解析Cookie生成与客户端相对应的内容
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。 查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容
1.记录用户访问次数 2.Cookie的不可跨域名性 3.Unicode编码:保存中文 中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。 4.BASE64编码:保存二进制图片 5.设置Cookie的所有属性 6.Cookie的有效期;单位为秒(Second) 7.Cookie的修改、删除 8. Cookie的域名 9. Cookie的路径 10.Cookie的安全属性
如果用户是在自己家的电脑上上网,登录时就可以记住他的登录信息,下次访问时不需要再次登录,直接访问即可。实现方法是把登录信息如账号、密码等保存在Cookie中,并控制Cookie的有效期,下次访问时再验证Cookie中的登录信息即可。
保存登录信息有多种方案。最直接的是把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到Cookie中。
还有一种方案是把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。如果不希望保存密码,还可以把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了。
这几种方案验证账号时都要查询数据库。
本例将采用另一种方案,只在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。实现方式是把账号按照一定的规则加密后,连同账号一块保存到Cookie中。下次访问时只需要判断账号的加密规则是否正确即可。本例把账号保存到名为account的Cookie中,把账号连同密钥用MD1算法加密后保存到名为ssid的Cookie中。验证时验证Cookie中的账号与密钥加密后是否与Cookie中的ssid相等。
提示:Cookie中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码。
Session简介 除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。 Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。 Session是服务端的机制,服务器使用一种类似于散列表的结构在服务器保存信息。 解析客户端请求并操作session id,按需保存状态信息 当程序需要为某个客户端请求创建session,首先检查客户端请求里是否已经包含一个session id,如果已经包含则说明以前已经为这个客户端创建了一个session,服务器就按照这个session id从服务器把这个session检索出来使用.如果不包含session id,则为这个客户端创建一个session并生成session id,并把这个session id发送回客户端进行保存
Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。
提示:Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。
1.Session的生命周期:为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。 Session在用户第一次访问服务器的时候自动创建。 Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session 2.Session的有效期
1、cookie数据存放在客户的浏览器上,session数据放在服务器上. 简单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,
客户端每次请求服务器的时候会发送 当前会话的session_id,服务器根据当前session_id判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。
由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的session_id,用特殊的浏览器伪造该用户的请求也是能够成功的。
session_id是服务器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性。
Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
3、设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
4、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
5、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)
注意:
session很容易失效,用户体验很差; 虽然cookie不安全,但是可以加密 ; cookie也分为永久和暂时存在的; 浏览器 有禁止cookie功能 ,但一般用户都不会设置; 一定要设置失效时间,要不然浏览器关闭就消失了; 例如: 记住密码功能就是使用永久cookie写在客户端电脑,下次登录时,自动将cookie信息附加发送给服务端。 application是全局性信息,是所有用户共享的信息,如可以记录有多少用户现在登录过本网站,并把该信息展示个所有用户。两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)
Session信息是存放在server端,但session id是存放在client cookie的,当然php的session存放方法是多样化的,这样就算禁用cookie一样可以跟踪
Cookie是完全保持在客户端的如:IE firefox 当客户端禁止cookie时将不能再使用