Java Web技术内幕:深入理解Session与Cookie

其实这个问题回答起来既简单又复杂,简单是因为它们本身只是 HTTP 协议中的一个配置项,在 Servlet 规范中也只是对应到一个类而已;说它复杂原因在于当我们的系统大到需要用到很多 ">Cookie 的时候,我们不得不考虑 HTTP 协议对 Cookie 数量和大小的限制,那么如何才能解决这个瓶颈呢? Session 也会有同样的问题,当我们的一个应用系统有几百台服务器的时候如何解决 Session 在多台服务器之间共享?它们还有一些安全问题,如 Cookie 被盗,Cookie 伪造等问题应如何避免。本章将详细解答这些问题,同时也将分享淘宝在解决这些问题时总结的一些经验。

Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的。例如,使用 Cookie 来传递信息时,随着 Cookie 个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如 Cookie 占用 200 个字节,如果一天的 PV 有几亿,它要占用多少带宽?所以有大访问量的时候希望用 Session,但是 Session 的致命弱点是不容易在多台服务器之间共享,所以这也限制了 Session 的使用。

10.1 理解 Cookie

Cookie 的作用我想大家都知道,通俗地说就是当一个用户通过 HTTP 协议访问一个服务器的时候,这个服务器会将一些 Key/Value 键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器的时候,数据又被完整地带回给服务器。

这个作用就像您去超市购物时,第一次给您办张购物卡,这个购物卡里存放了一些您的个人信息,下次您再来这个连锁超市时,超市会识别您的购物卡,下次直接购物就好了。

当初 W3C 在设计 Cookie 时实际上考虑的是为了记录用户在一段时间内访问 Web 应用的行为路径。由于 HTTP 协议是一种无状态协议,当用户的一次访问请求结束后,后端服务器就无法知道下一次来访问的还是不是上次访问的用户,在设计应用程序时,我们很容易想到两次访问是同一人访问与不同的两个人访问对程序设计和性能来说有很大的不同。例如,在一个很短的时间内,如果与用户相关的数据被频繁访问,可以针对这个数据做缓存,这样可以大大提高数据的访问性能。Cookie 的作用正是在此,由于是同一个客户端发出的请求,每次发出的请求都会带有第一次访问时服务端设置的信息,这样服务端就可以根据 Cookie 值来划分访问的用户了。

10.1.1 Cookie 属性项

当前 Cookie 有两个版本:Version 0 和 Version 1。通过它们有两种设置响应头的标识,分别是 “Set-Cookie”和“Set-Cookie2”。这两个版本的属性项有些不同,表 10-1 和表 10-2 是两个版本的属性介绍。

表 10-1.Version 0 属性项介绍

属性项 属性项介绍 NAME=VALUE 键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样 Expires 过期时间,在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT Domain 生成该 Cookie 的域名,如 domain="xulingbo.net" Path 该 Cookie 是在当前的哪个路径下生成的,如 path=/wp-admin/ Secure 如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie

表 10-2.Version 1 属性项介绍

属 性 项 属性项介绍 NAME=VALUE 与 Version 0 相同 Version 通过 Set-Cookie2 设置的响应头创建必须符合 RFC2965 规范,如果通过 Set-Cookie 响应头设置,默认值为 0,如果要设置为 1,则该 Cookie 要
遵循 RFC 2109 规范 Comment 注释项,用户说明该 Cookie 有何用途 CommentURL 服务器为此  Cookie 提供的 URI 注释 Discard 是否在会话结束后丢弃该 Cookie 项,默认为 fasle Domain 类似于 Version 0 Max-Age 最大失效时间,与 Version 0 不同的是这里设置的是在多少秒后失效 Path 类似于 Version 0 Port 该 Cookie 在什么端口下可以回传服务端,如果有多个端口,以逗号隔开,如 Port="80,81,8080" Secure 类似于 Version 0

以上两个版本的 Cookie 中设置的 Header 头的标识符是不同的,我们常用的是 Set-Cookie:userName=“junshan”; Domain=“xulingbo.net”,这是 Version 0 的形式。针对 Set-Cookie2 是这样设置的:Set-Cookie2:userName=“junshan”; Domain=“xulingbo.net”; Max-Age=1000。但是在 Java Web 的 Servlet 规范中并不支持 Set-Cookie2 响应头,在实际应用中 Set-Cookie2 的一些属性项却可以设置在 Set-Cookie 中,如这样设置:Set-Cookie:userName=“junshan”; Version=“1”;Domain=“xulingbo.net”;Max-Age=1000。

时间: 2024-10-31 13:46:25

Java Web技术内幕:深入理解Session与Cookie的相关文章

Java Web技术经验总结(二)

该系列的第一篇在此:Java Web技术经验总结一,主要包含我在日常工作中的经验和心得体会(如有不足之处欢迎指出). Maven的使用经验 依赖的scope有test.provided.compile等.test:一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等:provided:表示容器或者JDK已经提供该依赖,打包时不需要打包入war:compile:默认范围,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候

Java Web技术经验总结(三)

在Spring项目中,如果需要配置spring xml文件,要注意,将顶部的schema信息中的版本信息去掉,这样xml配置文件就不会跟具体的spring版本耦合:而且还可以避免一些诡异的问题,例如下面这种异常 org.xml.sax.SAXParseException :schema_reference.4: 无法读取方案文档 'http://www.springframework.org/schema/beans/spring-beans-3.0.xsd', 原因为 1) 无法找到文档; 2

Java Web技术经验总结(四)

Spring MVC中返回JSON数据的不同方法 Spring 3 MVC ContentNegotiatingViewResolver example,该视图解析器,可以用于将同一份模型数据展现为不同的表现形式,例如JSON.XML和RSS等: 利用@ResponseBody注解修饰控制器方法,并在xxx-servlet.xml中开启spring mvc支持--<mvc: annoation-driven/>,这种机制背后的原理是MessageConverter. 最近用Mockito写单元

java web技术需要从服务器端数据库中下载数据到本地

问题描述 由于是web技术所以代码也要放在服务器上.客户端运行一个网页的时候,后台自动运行从服务器端的数据库中把数据写到本地的txt文本文件中.细节要求是按照日期判断同一天的数据是一个txt.隔天自动生成另一个txt..格式要求数据能自动换行求完成代码..加注解....万分感谢 解决方案 解决方案二:我晕...没人知道啊...高手哪去啦....解决方案三:我晕.没人知道啊..高手哪去了解决方案四:我晕.没人知道啊..高手哪去了

快速理解 session/token/cookie 认证方式

目录 目录 cookie session token cookie Web Application 一般以 HTTP 协议作为传输协议, 但 HTTP 协议是无状态的. 也就是说 server-side 与 client-side 一旦数据交换完毕后,两者之间的连接就会被关闭. client-side 再次发送请求时, 需要建立新的连接, 这就意味着 server-side 和 client-side 两者之间无法通过 HTTP 的连接来实现 会话跟踪. 显然, 这是不合理的, 因为这样无法保证

java web 技术-求助!关于模拟登陆利用接收的cookie判断登录是否成功,遇到了问题,,求大神们相助!在下多谢!

问题描述 求助!关于模拟登陆利用接收的cookie判断登录是否成功,遇到了问题,,求大神们相助!在下多谢! 在下学生最近在做一个用java开发模拟登陆校内网的项目,可是学校使用struts2做的,url的尾缀是.action,登陆前和登陆后的url一致,无法用html来判断,,于是就想用cookie来判断登陆是否成功,可是面临一个问题就是请求标头的Cookie是JSESSIONID=3CDAB1BA4520BD1F53E62F9D5BCCCC49之类的,发送的jsessionid和接收的jses

java web 技术-web应用实现实时视频通讯的,java为后台

问题描述 web应用实现实时视频通讯的,java为后台 基于web服务的实时视频通讯的大体架构模型(视频流的技术),java为后台, 赐教!! 解决方案 参考webrtc的模型 http://www.cnblogs.com/zhaozhan/archive/2012/03/31/webrtc.html

Java Web技术经验总结(一)

接口的权限认证,使用拦截器(HandlerInterceptorAdapter),参考:第五章 处理器拦截器详解--跟着开涛学SpringMVC.注意:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的.最先应该使用的 "@Autowired"的含义是:ListableBeanFactory接口定义的<T> Map<Stri

用Java Web技术控制电子设备,比如数据采集卡,能实现吗?

问题描述 小弟想做一个网站,用这个网站来控制一套数据采集装置,在网站上发送指令,数据采集装置就把数据写到数据库里面,这样的想法可能实现吗,该用什么技术呢?? 解决方案 可以,但是得需要硬件设备的JAVA版接口,一般硬件接口,输入输出数据都固定好了.提取相应数据即可,也可联系硬件开发商,开发个人需求的接口.