HTTP协议自己是无状态的,自己并不能支持服务端保存客户端的状态信息,因而,Web Server中引入了session的概念,用来保存客户端的状态信息。 数据库
2 ) 这个用户随后的全部请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪一个session。跨域
这种机制不使用IP做为标识,是由于不少机器是经过代理服务器方式上网,无法区分每一台机器。数组
对于session标识号(sessionID),有两种方式实现:cookies和URL重写。浏览器
1)URL重写。
Web Server在返回Response的时候,检查页面中全部的URL,包括全部的链接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。
下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。安全
2)Cookie。 服务器
若是客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。 cookie
客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。网络
实际上大多数的应用都是用 Cookie 来实现Session跟踪的,cookies是实现session的一种方式,经过cookies,把sessionID发送给服务器,来实现session。session
Cookie的缺陷数据结构
(1)cookie会被附加在每一个HTTP请求中,因此无形中增长了流量。
(2)因为在HTTP请求中的cookie是明文传递的,因此安全性成问题。(除非用HTTPS)
(3)Cookie的大小限制在4KB左右。对于复杂的存储需求来讲是不够用的。
Cookie的根本做用就是在客户端存储用户访问网站的一些信息。典型的应用有:
一、记住密码,下次自动登陆。
二、购物车功能。
三、记录用户浏览数据,进行商品(广告)推荐。
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
而Session中可以存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也可以直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。可以把Session看作是一个Java容器类。
三、安全性(隐私策略)的不一样
Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以致修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如帐号密码等尽可能不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都可以有效的保护。
四、有效期上的不一样
只须要设置Cookie的过时时间属性为一个很大很大的数字,Cookie就能够在浏览器保存很长时间。 因为Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过时时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。
五、对服务器形成的压力不一样
Session是保管在服务器端的,每一个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。
六、 跨域支持上的不一样
Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均可以访问该Cookie。跨域名Cookie现在被广泛用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。
添加Cookie
Cookie cookie = new Cookie("user", "suntao"); cookie.setMaxAge(7*24*60*60); // 一星期有效 response.addCookie(cookie);
获取Cookie
// 由于取得的是整个网页做用域的Cookie的值,因此获得的是个数组 Cookie[] cookies = request.getCookies(); for(int i = 0 ; i < cookies.length ; i++){ String name = cookies[i].getName() ; String value = cookies[i].getValue() ; }