SSM基础篇(二)--Cookie&Session

会话

  • 当浏览器发请求访问服务器开始,一直到访问服务器结束,浏览器关闭为止,这期间浏览器和服务器之间产生的全部请求和响应加在一块儿,就称之为浏览器和服务器之间的一次会话。
  • 在一次会话中每每会产生一些数据,而这些数据每每是须要咱们保存起来的,可使用cookie或者session保存会话中产生的数据。
  • 由于http协议是无状态的,每次的请求访问都是独立的,没办法追踪到上一次访问的状态,后端就没法知道此次的访问是哪位,因此就要一些技术来帮助后台辨别此次的请求是谁。而这二者Cookie与Session都是Web程序中经常使用的技术,用来跟踪用户的整个会话。

Cookie

  1. Cookie是将会话中产生的数据保存在客户端,是客户端技术。
  2. Cookie是基于两个头进行工做的:分别是Set-Cookie响应头和Cookie请求头
  3. 经过Set-Cookie响应头将cookie从服务器端发送给浏览器,让浏览器保存到

内部;而浏览器一旦保存了cookie,之后浏览器每次访问服务器时,都会通
过cookie请求头,将cookie信息再带回服务器中。在须要时,在服务器端能够获取请求中的cookie中的数据,从而实现某些功能。
imageweb

cookie的API及应用

一、建立Cookie对象后端

Cookie c = new Cookie(String name, String value);
// 建立cookie的同时须要指定cookie的名字和cookie要保存的值
// Cookie的名字一旦指定后,就没法修改!

二、将Cookie添加到response响应中跨域

response.addCookie( Cookie c );
// 将cookie添加到响应中,由服务器负责将cookie信息发送给浏览器,再由浏览器保
存到内部(能够屡次调用该方法,添加一个以上的cookie)

三、获取请求中的全部cookie对象组成的数组数组

Cookie[] cs = request.getCookies();
// 获取请求中携带的全部cookie组成的cookie对象数组,若是请求中没有携带任何
cookie,调用该方法会返回null。

四、删除浏览器中的Cookie浏览器

  • cookie的API中没有提供直接删除cookie的方法,能够经过别的方式间接删除cookie
  • 删除名称为cart的cookie:能够向浏览器再发送一个同名的cookie(即名称也叫作cart),并设置cookie的最大生存时间为零,因为浏览器是根据cookie的名字来区分cookie,若是先后两次向浏览器发送同名的cookie,后发送的cookie会覆盖以前发送的cookie。然后发送的cookie设置了生存时间为零,所以浏览器收到后也会当即删除!

代码示例:安全

//建立一个名称为cart的cookie
Cookie c = new Cookie("cart", "");
//设置cookie的最大生存时间为零
c.setMaxAge( 0 );
//将cookie添加到响应中,发送给浏览器
response.addCookie( c );
out.write( "成功删除了名称为cart的cookie..." );

五、Cookie的经常使用方法服务器

cookie.getName(); // 获取cookie的名字
cookie.getValue(); // 获取cookie中保存的值
cookie.setValue(); // 设置/修改cookie中保存的值(没有setName方法,由于cookie的名字没法修改)
cookie.setMaxAge(); //设置cookie的最大生存时间(若是不设置,cookie默认在一次会话结束时销毁!)

六、setMaxAge方法:设置cookie的最大生存时间cookie

  • 若是不设置该方法,cookie默认是会话级别的cookie,即生存时间是一次会话。当浏览器关闭,会话结束时,cookie也会被销毁(cookie默认存在浏览器的内存中,当浏览器关闭,内存释放,cookie也会随着内存的释放而销毁。)
  • 若是设置了该方法,cookie将不会保存到浏览器的内存中,而是以文件形式保存到浏览器的临时文件夹中(也就是硬盘上),这样再关闭浏览器,内存释放,保存到硬盘上的cookie文件不会销毁,再次打开浏览器,还能够获取硬盘上的cookie信息。

代码示例:网络

//建立一个Cookie对象,将商品信息保存到cookie中
Cookie cookie = new Cookie( "cart", prod );
//设置cookie的最大生存时间, 单位:秒
cookie.setMaxAge( 60*60*24 );
//将cookie对象添加到response响应中
response.addCookie( cookie );

Cookie的不可跨域名性

不少网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?
答案是否认的。Cookie具备不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操做Google的Cookie,而不能操做Baidu的Cookie。session

Cookie的有效期

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中经过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。
若是maxAge属性为正数,则表示该Cookie会在maxAge秒以后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。不管客户关闭了浏览器仍是电脑,只要还在maxAge秒以前,登陆网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。

Cookie的安全属性

HTTP协议不只是无状态的,并且是不安全的。使用HTTP协议的数据不通过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。若是不但愿Cookie在HTTP等非安全协议中传输,能够设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。

Session

  1. Session是将会话中产生的数据保存在服务器端,是服务器端技术
  2. Session是一个域对象,session中也保存了一个map集合,往session中存数据,其实就是将数据保存到session的map集合中。
  3. 经过session.setAttribute()方法能够将数据保存到session中,经过session.getAttribute()方法能够将数据从session中取出来。

image

session是一个域对象

获取session对象:

request.getSession()
// 获取一个session对象;若是在服务器内部有当前浏览器对应的session,则直接返回该session对象;若是没有对应session,则会建立一个新的session对象再返回;

Session是一个域对象,session中也保存了一个map集合,而且session中也提供了存取数据的方法,以下:

session.setAttribute(String attrName, Object attrValue);
// 往session域中添加一个域属性,属性名只能是字符串类型,属性值能够是任意类型。
session.getAttribute(String attrName);
// 根据属性名获取域中的属性值,返回值是一个Object类型

Session域对象的三大特征:

生命周期:

建立session:

第一次调用request.getSession()方法时,会建立一个session对象。(当浏览器在服务器端没有对应的session时,调用request.getSession()方法服务器会建立一个session象。)

销毁session:
  • 超时销毁:默认状况下,当超过30分钟没有访问session,session就会超时销毁。(30分钟是默认时间,能够修改,但不推荐修改)
  • 自杀:调用session的invalidate方法时,会当即销session。
  • 意外身亡:当服务器非正常关闭时(硬件损坏,断电,内存溢出等致使服务器非正常关闭),session会随着服务器的关闭而销毁;

当服务器正常关闭,在关闭以前,服务器会将内部的session对象序列化保存到服务器的work目录下,变为一个文件。这个过程叫作session的钝化(序列化);再次将服务器启动起来,钝化着的session会再次回到服务器,变为服务器中的对象,这个过程叫作session的活化(反序列化)。

做用范围:

在一次会话范围内(获取到的都是同一个session对象)

主要功能:

在整个会话范围内实现数据的共享

二者的区别

Cookie和session都属于会话技术,均可以保存会话中产生的数据,但因为cookie和session的工做原理和特色不一样,所以二者的应用场景也不同。

Cookie的特色:

  1. cookie是将会话中产生的数据保存在浏览器客户端, 是客户端技术(JS能够访问cookie)
  2. cookie是将数据保存在客户端浏览器,容易随着用户的操做致使cookie丢失或者被窃取,所以cookie中保存的数据不太稳定,也不太安全。
  3. 但cookie将数据保存在客户端,对服务器端没有太多影响,能够将数据保存很长时间。
  4. 总结:所以cookie中适合存储须要长时间保存、但对安全性要求不高的数据。
  5. 浏览器对cookie的大小和个数都有限制,通常推荐每个站点给浏览器发送的cookie数量不超过20个,每个cookie的大小不超过1kb。
  6. Cookie的应用:实现购物车、记住用户名、30天内自动登陆等。

Session的特色:

  1. session是将会话中产生的数据保存在服务器端,是服务器端技术
  2. session将数据存在服务器端的session对象中,相对更加的安全,并且更加稳定。不容易随着用户的操做而致使session中的数据丢失或者是被窃取。
  3. 但session是服务器端的对象,在并发量较高时每个浏览器客户端在服务器端都要对应一个session对象,占用服务器的内存空间,影响效率。
  4. 总结:所以session中适合存储对安全性要求较高,但不须要长时间保存的数据。
  5. Session的应用:保存登陆状态、保存验证码

Session的有效期

因为会有愈来愈多的用户访问服务器,所以Session也会愈来愈多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。若是超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,能够经过对应的getMaxInactiveInterval()获取,经过setMaxInactiveInterval(longinterval)修改。

Session的超时时间也能够在web.xml中修改。另外,经过调用Session的invalidate()方法可使Session失效。

相关文章
相关标签/搜索