- 浏览: 157901 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1517http://blog.csdn.net/jianxuan/ ... -
CXF-RESTFUL 入参是复合对象的使用方法
2012-12-18 18:31 1119java 开发CXF-RESTFUL,在服务端的入参如果比 ... -
CXF-WebClient客户端调用,配置JacksonProvider转换器的方法
2012-12-17 11:31 2809java语言调用cxf-rest服务,可以通过CXF-WebC ... -
classpath:xxx.xml 与 classpath*:xxx.xml的区别
2012-12-14 14:45 773在使用开源框架如spring、struts2等经常需要配 ... -
最新SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
2012-12-14 14:19 692一 开发环境 1、动态web工程 2、部分依赖 ... -
远程通信技术实现原理(RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS)
2012-12-10 15:16 840在分布式服务框架中, ... -
HTTP Keep-Alive详解
2012-12-07 10:15 828HTTP Keep Alive HTTP Keep-Alive ... -
cxf-rest 配置JSonProvider 来定制JSON的转换格式
2012-12-06 17:08 1418关于CXF JSonProvider CXF通过JSonPro ... -
myeclipse 开发webservice 方法
2012-06-14 18:33 660见附件::: -
基于CXF的JAX-WS、JAX-RS(RESTful)的webService
2012-06-14 15:51 1515原文链接:http://www.open-open.com/l ... -
Web service框架 ---Axis1,Axis2,Xfire,CXF区别
2012-06-13 18:36 1291原文地址:http://494078416.iteye.com ... -
JAVA中的Web服务规范:jax-ws|jax-rs|jaxm
2012-06-13 17:13 1304JAVA 中共有三种WebService 规范,分别是JAXM ... -
主题:Web Service实践之——开始XFire
2012-06-13 16:29 640原文链接: http://www.ite ... -
java 调用webservice的各种方法总结
2012-06-13 16:13 893原文链接:http://www.blogjava.n ... -
利用Session防止表单重复提交
2011-12-13 18:36 11771 由于服务器缓慢或者 ... -
终于淘得几款很好的jquery UI 框架
2011-12-09 17:47 1288Liger UI框架 http://www.ligerui ... -
servlet 中获得spring Bean 的方法
2011-12-01 10:58 1116只需要servlet 中的servletCo ... -
网络通信与安全 一点学习总结【简要版】
2011-09-28 16:59 920花了一天的时间对网络通信与安全方面的知识进行了扫盲式学习,通篇 ... -
servlet 上传文件
2011-09-21 11:08 705原文:http://zhidao.baidu.com/ques ... -
修改cxf rest的返回时间格式
2011-09-19 18:19 937参考:http://stackoverflow.com/que ...
相关推荐
在Android开发中,获取设备的网络连接状态是常见的需求,比如检查用户是否已经连接到互联网,以便决定是否加载网络数据或者执行网络相关的操作。本文将详细介绍如何在Android中实现一个获取网络连接状态的实例。 ...
其中,`TCP_INFO`结构体可以提供更详细的信息,包括连接状态(如ESTABLISHED、CLOSE_WAIT等)。我们可以通过以下步骤获取TCP连接状态: 1. 使用`getsockopt(socket_fd, IPPROTO_TCP, TCP_INFO, &tcp_info, &len)`,...
通过以上步骤,你就能在Android应用中实现对蓝牙设备连接状态的有效监听和管理,从而为用户提供更丰富的交互体验。当然,实际项目中可能会有更多复杂情况,例如错误处理、状态恢复等,需要根据具体需求进行相应的...
labview tcp 检查连接状态.png labview tcp 检查连接状态.png
3. **UDP连接状态**:由于UDP是无连接的,所以没有传统意义上的“连接状态”。但我们可以查看哪些UDP端口正在发送或接收数据。 文件名为“cports.exe”的程序可能是一个实用工具,用于显示这些详细信息。它可以帮助...
在.NET框架中,尤其是C#编程环境下,开发者经常需要处理与网络相关的任务,其中之一就是判断用户的网络连接状态。本文将详细讲解如何在Windows Forms(Winform)应用中实现这一功能,以便于创建更加智能和用户友好的...
总的来说,"iOS网络连接状态判断 JPNetwork"库为iOS开发者提供了一个便捷的工具,使得网络状态的检测变得更加容易,从而能够更好地适应各种网络环境,提高应用的稳定性和用户体验。它的易用性和实用性使其成为许多...
在Android开发中,监听USB连接状态是一个常见需求,尤其是在涉及到需要与USB设备通信的应用场景中。当USB设备插入或者拔出时,应用程序可能需要执行相应的操作,比如启动服务、弹出提示信息等。为了实现这一功能,...
7. **连接状态判断**:程序能够自动判断无线网络的连接状态,这可能涉及到定期查询WLANAPI提供的连接信息,例如检查网络是否已连接,信号强度,数据传输状态等。 8. **错误处理**:在实际应用中,良好的错误处理...
2、判断网络连接状态的方法(如mobile网络和wifi网络) 3、用广播WifiManager.NETWORK_STATE_CHANGED_ACTION和ConnectivityManager.CONNECTIVITY_ACTION都行,但判断连接是否成功时,用NetworkInfo的getState()方法...
在Android平台上实现无线Wi-Fi连接打印机并获取打印机状态是一项实用且技术性强的任务。本文将深入探讨这个主题,基于提供的博客链接以及"KitchenPrintDemo1"这个项目文件名,我们可以推测这是一个示例应用,用于...
用于监测当前网络连接状态,使用C#编写 if (IsConnectedToInternet()) MessageBox.Show("已连接在网上!","提示"); else MessageBox.Show("未连接在网上!!","提示");
Android编程获取网络连接状态(3GWifi)及调用网络配置界面
开发者可以通过日志打印或者UI更新来显示当前的连接状态,例如在Java文件顶部的提示信息。 6. **异常处理**:在实际开发中,我们需要处理各种可能的异常情况,比如蓝牙未开启、设备未找到、连接失败等。通过异常...
当WinCC与PLC之间建立或断开连接时,可以通过改变变量的值来更新文本框的内容,以此来直观地反映当前的连接状态。具体步骤如下: #### 1. 变量配置 首先,在WinCC项目中定义一个变量,该变量用于存储连接状态的信息...
使用JS在浏览器中判断当前网络状态的几种方法如下: 1. navigator.onLine 2. ajax请求 3. 获取网络资源 4. bind() 1. navigator.onLine 通过navigator.onLine判断当前网络状态: if(navigator.onLine){ ... }...
在VB6.0中实现网络连接状态测试,开发者通常会使用Winsock控件或者API函数,如Winsock Control,它提供了一种简单的方式来处理TCP/IP协议。程序可能包含以下关键步骤: 1. 初始化Winsock控件:设置主机地址和端口号...
// 遍历所有网络信息,检查是否至少有一个网络处于连接状态 for (int i = 0; i ; i++) { System.out.println(i + "===状态===" + networkInfo[i].getState()); System.out.println(i + "===类型===" + ...
Tdiag_Status结构体包含了多种关于通信连接状态的信息,如连接状态(State)、错误代码(Error_code)等。通过这种方式,你可以将T-DIAG指令的结果存储在这个结构体变量中,然后在程序中进一步处理。 将T-DIAG指令...
TCP 连接状态详解 TCP 连接状态是指在 TCP 协议中,连接的不同阶段所对应的状态。这些状态包括 LISTEN、SYN-SENT、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT...