- 浏览: 153084 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (130)
- Database (5)
- JavaSE (23)
- JavaScript (11)
- Struts2 (15)
- Hibernate (11)
- Spring (16)
- Linux (4)
- Jquery (3)
- Tools (12)
- Jsp (7)
- 杂谈 (9)
- WEB Project (10)
- WebService (16)
- maven (2)
- android (1)
- memcache (2)
- 网络通信 (4)
- solr (1)
- cxf (7)
- powerdesigner (1)
- jxls (1)
- springmvc (1)
- nosql (1)
- node.js (0)
- thrift (0)
- REST (1)
- tag (1)
最新评论
HTTP是无状态链接,请求-回应完毕后客户端和服务器之间的链接就会断开。那么服务器是如何记住用户的,例如网上购物车,每次新添加购物项,上次添加的 购物项还能存在,这是如何实现的?可以推测应该是客户端或服务器端将购物的信息记录下来,创建一个新的链接时候读取记录下来的数据,这样就实现无状态的 HTTP连接提供有状态的连接的效果。
服务器端:
在网络服务器看来,所有的HTTP请求都独立于之前的请求,也就是说他只识别你这次请求头中包含的信息,然后做出对应的响应。状态管理机制克服了HTTP 的一些限制并允许网络客户端和服务器端维护请求间的关系,这种关系维持的期间叫做Session(会话)。Session是服务器端的一种保存上下文信息 的机制,它是针对每一个用户的,session的值保存在服务器端。当服务器端程序需要为客户端请求创建一个session的时候,会首先检查请求中是否 包含了一个session标识—sessionID,如果包含sessionID,说明以前就已经为该用户创建过session,服务器会直接按照这个 sessionID将对应的session检索出来使用(没有检索到可能会新建一个);如果客户端请求没有包含sessionID,则为这个用户新建一个 session并生成一个相关联的sessionID(sessionID的值应该是一个不会重复,也不容易找到规律的字符串),这个sessionID 将在本次响应中返回给客户端保存。
购物车例子:
当你买第一个物品的时候点击“购买”,浏览器将请求发送到服务器(该请求中没有sessionID,因为这是你要买的第一个物品,之前没有和服务器 交互),服务器发现没有sessionID,就会为客户端创建一个session和与之相关联的sessionID,并把刚创建的这个sessionID 在本次响应中返回给客户端,客户端的浏览器接收到返回的响应把这个sessionID存储,当你再次向购物车添加物品时候,浏览器会在后台自动将你存储的 sessionID发送给服务器,服务器按照这个sessionID检索到对应的session,然后进行处理返回给你页面,这样你才能够看到上次添加的 购物项。
客户端:
在客户端用来存储服务器返回的sessionID和其他一些信息的称为cookie。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过 在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,在交互的时候浏览器检查所有存储的cookie,如果某个 cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。可以使用HEAD命令 得到服务器的响应头,有的网站响应头中包含set-cookie项(例如hi.baidu.com),该项中包含一个名值对,过期时间,路径和域,这些都 是由服务器指定。路径就是跟在域后面的url路径,路径和域组成了cookie的作用范围的大小;设置过期时间,就会将cookie保存到硬盘上,关闭浏 览器再打开,cookie依然有效,直到请求的时间超过了指定的时间。如果不设置过期时间,则cookie一般不存储在硬盘上而是保存在浏览器的内存里, 当然这种行为并不是规范规定的。所以cookie有两种,一种是存储到本地的文本文件之中的,叫做persistent (持久化的)cookie;另一种是并不存储在本地硬盘之中,而是放在浏览器的内存里面,我叫做session cookie。Persistent cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于session cookie,不同的浏览器有不同的处理方式,有的浏览器可以跨窗口使用比如Firefox,有的不能比如IE但是IE允许一个窗口生成的窗口(子窗口) 共享session cookie。
推测:如果客户端禁用cookie,那么将无法向购物车中添加物品。
禁用IE的cookie,访问当当网,选中一本书,点击购买,发现返回的页面为空白页面,并没有我购买的书;允许使用cookie,购买返回的页面中购买 的书已被添加到购物车之中。说明推测是正确的。可是如果禁用浏览器的cookie就无法访问需要创建session的服务器了吗?由于cookie可以被 人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id 直接附加在URL路径的后面,这样服务器就可以解析url地址后面的sessionID进行处理。发送SessionID有两种方式,一种就是将 sessionID存放在cookie里面浏览器自动发送;另一种是当客户端禁用cookie时,通过URL重写将sessionID发送给服务器。
关于“无状态的HTTP连接提供有状态的连接
Session的生命周期:
Session什么时候会被服务器删除,有人可能会认为当客户端的浏览器窗口关闭时候session就会被删除,其实不然。事实上除非程序通知服务器删除 一个session,否则服务器会一直保留。浏览器关闭之前不会通知服务器,所以服务器不会知道浏览器什么时候关闭,之所以有“浏览器关 闭,session就消失”这样的感觉,是因为大多数的session机制都是用会话 cookie(session cookie)来保存sessionID,这样浏览器关闭之后sessionID就消失了,再次连接服务器时候,分配了新的sessionID,也就不能 找到以前那个session了,但是如果用persistent cookie来保存sessionID的话,再打开新的浏览器也能够找到那个sessionID加到请求之中,服务器就能够找到那个session。由于 浏览器的关闭或者浏览器的进程被强行杀死或者断网,服务器都无法知道,所以服务器设置了一个失效时间,只要距离客户端上次访问的时间超过了失效时间,则认 为客户端活动停止了,此时删除session节省存储空间。
例子:登录电子邮箱,长时间(超过失效时间)没有操作,再对邮箱操作的话页面刷新之后提示你页面已经过期,此时session已经被删除。
总结:HTTP是无状态链接,因为要实现有状态链接的效果,所以采用session和cookie两种机制。 客户端请求需要包含服务器指定的唯一的sessionID,如果请求中没有sessionID,服务器将为该请求创建一个session和与之相关联的 sessionID并把这个sessionID放入响应之中,并加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,将响应返回给客户端,客 户端的浏览器按照规则解析响应,如果浏览器支持cookie则将sessionID和其他信息存储起来(persistent cookie 或者session cookie),下次再次访问同一服务器时候浏览器将对应的cookie和请求头一起发送给服务器,服务器按照sessionID进行检索找到对应的 session进行处理。
服务器端:
在网络服务器看来,所有的HTTP请求都独立于之前的请求,也就是说他只识别你这次请求头中包含的信息,然后做出对应的响应。状态管理机制克服了HTTP 的一些限制并允许网络客户端和服务器端维护请求间的关系,这种关系维持的期间叫做Session(会话)。Session是服务器端的一种保存上下文信息 的机制,它是针对每一个用户的,session的值保存在服务器端。当服务器端程序需要为客户端请求创建一个session的时候,会首先检查请求中是否 包含了一个session标识—sessionID,如果包含sessionID,说明以前就已经为该用户创建过session,服务器会直接按照这个 sessionID将对应的session检索出来使用(没有检索到可能会新建一个);如果客户端请求没有包含sessionID,则为这个用户新建一个 session并生成一个相关联的sessionID(sessionID的值应该是一个不会重复,也不容易找到规律的字符串),这个sessionID 将在本次响应中返回给客户端保存。
购物车例子:
当你买第一个物品的时候点击“购买”,浏览器将请求发送到服务器(该请求中没有sessionID,因为这是你要买的第一个物品,之前没有和服务器 交互),服务器发现没有sessionID,就会为客户端创建一个session和与之相关联的sessionID,并把刚创建的这个sessionID 在本次响应中返回给客户端,客户端的浏览器接收到返回的响应把这个sessionID存储,当你再次向购物车添加物品时候,浏览器会在后台自动将你存储的 sessionID发送给服务器,服务器按照这个sessionID检索到对应的session,然后进行处理返回给你页面,这样你才能够看到上次添加的 购物项。
客户端:
在客户端用来存储服务器返回的sessionID和其他一些信息的称为cookie。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过 在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,在交互的时候浏览器检查所有存储的cookie,如果某个 cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。可以使用HEAD命令 得到服务器的响应头,有的网站响应头中包含set-cookie项(例如hi.baidu.com),该项中包含一个名值对,过期时间,路径和域,这些都 是由服务器指定。路径就是跟在域后面的url路径,路径和域组成了cookie的作用范围的大小;设置过期时间,就会将cookie保存到硬盘上,关闭浏 览器再打开,cookie依然有效,直到请求的时间超过了指定的时间。如果不设置过期时间,则cookie一般不存储在硬盘上而是保存在浏览器的内存里, 当然这种行为并不是规范规定的。所以cookie有两种,一种是存储到本地的文本文件之中的,叫做persistent (持久化的)cookie;另一种是并不存储在本地硬盘之中,而是放在浏览器的内存里面,我叫做session cookie。Persistent cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于session cookie,不同的浏览器有不同的处理方式,有的浏览器可以跨窗口使用比如Firefox,有的不能比如IE但是IE允许一个窗口生成的窗口(子窗口) 共享session cookie。
推测:如果客户端禁用cookie,那么将无法向购物车中添加物品。
禁用IE的cookie,访问当当网,选中一本书,点击购买,发现返回的页面为空白页面,并没有我购买的书;允许使用cookie,购买返回的页面中购买 的书已被添加到购物车之中。说明推测是正确的。可是如果禁用浏览器的cookie就无法访问需要创建session的服务器了吗?由于cookie可以被 人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id 直接附加在URL路径的后面,这样服务器就可以解析url地址后面的sessionID进行处理。发送SessionID有两种方式,一种就是将 sessionID存放在cookie里面浏览器自动发送;另一种是当客户端禁用cookie时,通过URL重写将sessionID发送给服务器。
关于“无状态的HTTP连接提供有状态的连接
Session的生命周期:
Session什么时候会被服务器删除,有人可能会认为当客户端的浏览器窗口关闭时候session就会被删除,其实不然。事实上除非程序通知服务器删除 一个session,否则服务器会一直保留。浏览器关闭之前不会通知服务器,所以服务器不会知道浏览器什么时候关闭,之所以有“浏览器关 闭,session就消失”这样的感觉,是因为大多数的session机制都是用会话 cookie(session cookie)来保存sessionID,这样浏览器关闭之后sessionID就消失了,再次连接服务器时候,分配了新的sessionID,也就不能 找到以前那个session了,但是如果用persistent cookie来保存sessionID的话,再打开新的浏览器也能够找到那个sessionID加到请求之中,服务器就能够找到那个session。由于 浏览器的关闭或者浏览器的进程被强行杀死或者断网,服务器都无法知道,所以服务器设置了一个失效时间,只要距离客户端上次访问的时间超过了失效时间,则认 为客户端活动停止了,此时删除session节省存储空间。
例子:登录电子邮箱,长时间(超过失效时间)没有操作,再对邮箱操作的话页面刷新之后提示你页面已经过期,此时session已经被删除。
总结:HTTP是无状态链接,因为要实现有状态链接的效果,所以采用session和cookie两种机制。 客户端请求需要包含服务器指定的唯一的sessionID,如果请求中没有sessionID,服务器将为该请求创建一个session和与之相关联的 sessionID并把这个sessionID放入响应之中,并加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,将响应返回给客户端,客 户端的浏览器按照规则解析响应,如果浏览器支持cookie则将sessionID和其他信息存储起来(persistent cookie 或者session cookie),下次再次访问同一服务器时候浏览器将对应的cookie和请求头一起发送给服务器,服务器按照sessionID进行检索找到对应的 session进行处理。
发表评论
-
RESTFUL实现主流框架 CXF、Restlet、RESTEasy、Jersey对比
2013-10-21 10:37 1478http://blog.csdn.net/jianxuan/ ... -
CXF-RESTFUL 入参是复合对象的使用方法
2012-12-18 18:31 1086java 开发CXF-RESTFUL,在服务端的入参如果比 ... -
CXF-WebClient客户端调用,配置JacksonProvider转换器的方法
2012-12-17 11:31 2768java语言调用cxf-rest服务,可以通过CXF-WebC ... -
classpath:xxx.xml 与 classpath*:xxx.xml的区别
2012-12-14 14:45 752在使用开源框架如spring、struts2等经常需要配 ... -
最新SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
2012-12-14 14:19 670一 开发环境 1、动态web工程 2、部分依赖 ... -
远程通信技术实现原理(RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS)
2012-12-10 15:16 808在分布式服务框架中, ... -
HTTP Keep-Alive详解
2012-12-07 10:15 796HTTP Keep Alive HTTP Keep-Alive ... -
cxf-rest 配置JSonProvider 来定制JSON的转换格式
2012-12-06 17:08 1386关于CXF JSonProvider CXF通过JSonPro ... -
myeclipse 开发webservice 方法
2012-06-14 18:33 634见附件::: -
基于CXF的JAX-WS、JAX-RS(RESTful)的webService
2012-06-14 15:51 1483原文链接:http://www.open-open.com/l ... -
Web service框架 ---Axis1,Axis2,Xfire,CXF区别
2012-06-13 18:36 1259原文地址:http://494078416.iteye.com ... -
JAVA中的Web服务规范:jax-ws|jax-rs|jaxm
2012-06-13 17:13 1272JAVA 中共有三种WebService 规范,分别是JAXM ... -
主题:Web Service实践之——开始XFire
2012-06-13 16:29 619原文链接: http://www.ite ... -
java 调用webservice的各种方法总结
2012-06-13 16:13 865原文链接:http://www.blogjava.n ... -
利用Session防止表单重复提交
2011-12-13 18:36 11461 由于服务器缓慢或者 ... -
终于淘得几款很好的jquery UI 框架
2011-12-09 17:47 1260Liger UI框架 http://www.ligerui ... -
servlet 中获得spring Bean 的方法
2011-12-01 10:58 1077只需要servlet 中的servletCo ... -
网络通信与安全 一点学习总结【简要版】
2011-09-28 16:59 893花了一天的时间对网络通信与安全方面的知识进行了扫盲式学习,通篇 ... -
servlet 上传文件
2011-09-21 11:08 672原文:http://zhidao.baidu.com/ques ... -
修改cxf rest的返回时间格式
2011-09-19 18:19 904参考:http://stackoverflow.com/que ...
相关推荐
labview tcp 检查连接状态.png labview tcp 检查连接状态.png
获取android手机的连接状态的实例。
用于监测当前网络连接状态,使用C#编写 if (IsConnectedToInternet()) MessageBox.Show("已连接在网上!","提示"); else MessageBox.Show("未连接在网上!!","提示");
2、判断网络连接状态的方法(如mobile网络和wifi网络) 3、用广播WifiManager.NETWORK_STATE_CHANGED_ACTION和ConnectivityManager.CONNECTIVITY_ACTION都行,但判断连接是否成功时,用NetworkInfo的getState()方法...
Android编程获取网络连接状态(3GWifi)及调用网络配置界面
使用JS在浏览器中判断当前网络状态的几种方法如下: 1. navigator.onLine 2. ajax请求 3. 获取网络资源 4. bind() 1. navigator.onLine 通过navigator.onLine判断当前网络状态: if(navigator.onLine){ ... }...
判断网络连接状态例子,主要有判断本地和网络是否连接,网线是否掉线等等
监测当前网络连接状态.rar监测当前网络连接状态.rar监测当前网络连接状态.rar
通过系统广播监听蓝牙设备的连接状态,当蓝牙搜索发现设备时提示对应的蓝牙设备已发现,当蓝牙设备连接或断开显示蓝牙设备连接或断开。
可以查看本地进程所开放的TCP UDP端口 以及端口的连接状态
易语言取本机连接状态源码,取本机连接状态,IsNetConnectViaLAN,IsNetConnectViaModem,IsNetConnectViaProxy,IsNetConnectOnline,IsNetRASInstalled,GetNetConnectString,InternetGetConnectedState
Delphi定时检测判断网络数据库连接状态,用来判断局域网数据库的网络状态,定时检查局域网ODBC, ADO数据库是否连接正常。获得开始->程序->的启动组 的路径,别的特殊路径也可以用CSIDL_COMMON或的,在delphi中查一下...
android wifi连接打印机并获取打印机状态 博客地址http://blog.csdn.net/jinfulin/article/details/52622055
网络游戏-基于无状态网络协议模拟有状态连接的方法及系统.zip
vc设置本地连接编程,希望对菜鸟们有帮助
Delphi检测网络状态,是否连接Internet..rar
android_实时获取蓝牙profile连接状态.pdfandroid_实时获取蓝牙profile连接状态.pdfandroid_实时获取蓝牙profile连接状态.pdfandroid_实时获取蓝牙profile连接状态.pdfandroid_实时获取蓝牙profile连接状态.pdf...
本程序能实时监听并检测Android蓝牙的连接状态,无论是通过界面上的switch按钮打开/关闭手机蓝牙,还是手动打开/关闭手机蓝牙,程序都能监听当前的状态
仿QQ微信,Android开发中网络连接状态的判断(判断android设备是否有网络),详细了解请移步http://blog.csdn.net/zxc514257857/article/details/69219113
Android Socket连接,包含心跳检测,断线重连,数据发送等等 博客地址:http://blog.csdn.net/yuzhiqiang_1993/article/details/78094909