会话

为什么要维持会话。。会话跟踪

参考:http://blog.csdn.net/zhaifengmin/article/details/12442515

http://blog.chinaunix.net/uid-16371575-id-2746580.html

http://blog.csdn.net/dreamstar613/article/details/56831181

在客户端和服务器端保持状态的三个方法:维持客户端和服务器的会话

协议本身有状态

cookie机制:在客户端保持会话状态。给顾客一张卡片,卡片上记录着消费数量,每次消费时,顾客拿出卡片。

session机制:在服务器端保持会话状态。给顾客发会员卡,会员卡上只有卡号。顾客每次消费时,出示会员卡。然后店员在店里的记录本上找到这个卡号对应的记录添加一些消费信息。

为什么不支持cookie。cookie需要什么支持。先有cookie还是先有session.谁依赖于谁。

Cookie机制

Cookies:很多时候浏览器并不一定支持cookie,所以不建议使用cookie。

 1.Cookie的分发:

通过扩展HTTP协议来实现Cookie分发,服务器在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。

2.Cookie的内容:名字,值,过期时间,路径和域

名字和值

路径和域 就是构成了Cookie的作用范围。路径就是跟在域名后面的url路径

过期时间: 设置了Cookie的过期时间。这种Cookie被浏览器保存在硬盘中。下次再打开浏览器,Cookie依然有效。

没设置过期时间的Cookie的生命周期为浏览器会话期间。当浏览器关闭,这个cookie就消失了。这种生命周期为浏览器会话期的Cookie成为会话Cookie。会话Cookie保存在内存中。

3.Cookie的使用:cookie是由浏览器按照一定的原则自动发送给服务器的。这个原则就是:浏览器检查所有存储的Cookie,如果某个Cookie所生命的作用范围大于等于要请求的资源所在的位置,则把该Cookie附在请求资源的HTTP请求头上发送给服务器。就像顾客在自己所有的卡片中找到这家奶茶店的卡片一样(卡片的作用范围)。

4. JSP操作Cookie 

JSP设置Cookie。JSP读取Cookie。JSP删除Cookie。


Session机制

Session是把会话状态保存在服务器端的机制。

Session是实现网上商城的购物车的最佳方案,存储在某个客户Session中的一个集合对象就可充当该客户的一个购物车

1.什么时候创建Session:

并不是有客户端访问时session就会创建,而是在某Server端程序调用`HttpServletRequest.getSession(true)`这样的语句时,session才被创建。

JSP页面被编译成Servlet时,会自动加上这样一条语句`HttpSesssion session = HttpServletRequest.getSession(true);` 这也是JSP页面中隐含对象session的来历。

由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP页面中关闭它。

<%@page session="false"%>

2.创建session时服务器的操作

当程序需要为某个客户端请求创建session时,先看这个请求中有没有sessionid。

如果有sessionid,说明以前为这个请求创建过session,只要根据sessionid去找session。如果找不到,就再创建一个session。

如果没有sessionid,服务器为这次会话创建一个session对象,并会这次会话分配一个唯一标识号id。并且这个session对象和这个id唯一对应。 session对象被保存在服务器端。与这个session唯一对应的session id在本次响应中会返回给客户端保存。

3.客户端保存session id的方法

(1)使用cookie保存session id。这样  在客户端和服务器交互过程中,session id就可以自动的发送给服务器。

但是cookie可以为人为禁止。禁止cookie的做法。禁止cookie要有其它机制保存session id

(2)URL重写

(3)表单字段隐藏

4.删除session

(1)距离上一次收到客户端发送的session id的时间间隔超过session设置的超时时间

并不是关闭浏览器就会删除session。之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。 

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

(2)程序调用`HttpSession.invalidate()`

(3)服务器重启

javax.servlet.http.HttpSession

HttpSession是Java平台对Session机制的实现规范,因为它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持外,还会有一些规范里没有规定的细微差异。

例子 

import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request.getSession();//获取session

 /*以下两句是程序中的例子,类是程序中的类,不能照搬*/ 
session.setAttribute(Constants.CURRENT_USER, currentUser);//将当前用户放入session
User user = (User) session.getAttribute(Constants.CURRENT_USER);// 读取session中的用户

/*获取程序基本路径*/
String basePath = session.getServletContext().getRealPath("/");


request.getSession(); //获取session
setAttribute(String name ,obj value);//value为存储的对象,name为给这个对象起一个的名.换句话说就是将value对象以name名称绑定到会话
getAttribute(String name);//取得name的属性值,如果属性不存在则返回null,如果属性存在返回value对象
getServletContext();//返回当前会话的上下文环境,ServletContext对象可以使Servlet与web容器进行通信




posted on 2018-01-16 15:46  dreamstar  阅读(67)  评论(0编辑  收藏  举报