session

来源:互联网 发布:ubuntu安装vim失败 编辑:程序博客网 时间:2024/04/30 04:34

Session

                                                                                                                                          

什么是Session

1、 使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低传输的效率和增大服务器的难度

2、 Session技术是一种将会话状态保持在服务器端技术

当浏览器——请求——>web服务器某个servlet程序,会话开始,一个唯一的标示id

                                   保存会话状态的存储区域——>HttpSession对象

              浏览器(id)<——————id

              浏览器——(id)——>servlet

3、 客户端需要接受、记忆和回送Session的会话标识号,Session可以且通常是借助Cookie来传递会话标识号。

Session的跟踪机制

1、   Servlet API规范中定义了一个HttpSession接口,HttpSession接口定义了各种管理和操作会话状态的方法。

2、 HttpSession对象是保持会话状态信息的存储结构,一个客户端在WEB服务器端对应一个各自的HttpSession对象。

3、 WEB服务器并不会在客户端开始访问它时就创建HttpSession对象,只有客户端访问某个能与客户端开启会话的Servlet程序时,WEB应用程序才会创建一个与该客户端对应的HttpSession对象。

4、 WEB服务器为HttpSession对象分配一个独一无二的会话标识号,然后在响应消息中将这个会话标识号传递给客户端。客户端需要记住会话标识号,并在后续的每次访问请求中都把这个会话标识号传送给WEB服务器,WEB服务器端程序依据回传的会话标识号就知道这次请求是哪个客户端发出的,从而选择与之对应的HttpSession对象。

5、 WEB应用程序创建了与某个客户端对应的HttpSession对象后,只要没有超出一个限定的空闲时间段,HttpSession对象就驻留在WEB服务器内存之中,该客户端此后访问任意的Servlet程序时,它们都使用与客户端对应的那个已存在的HttpSession对象。

6、 HttpSession接口中专门定义了一个setAttribute方法来将对象存储到HttpSession对象中,还定义了一个getAttribute方法来检索存储在HttpSession对象中的对象,存储进HttpSession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。

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

Session的超时管理

1、   WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之对应的HttpSession对象。

2、 随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。

3、 WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。

4、 如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。

5、 会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。

       <session-config>

              <session-timeout>30</session-timeout>

       </session-config>

HttpSession接口中的方法

(1)                  getId方法

(2)           getCreationTime方法

(3)           getLastAccessedTime方法

(4)           setMaxInactiveInterval方法

(5)           getMaxInactiveInterval方法

(6)            isNew方法

*        如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。

(7)            invalidate方法

(8)           getServletContext方法

(9)           setAttribute方法

(10)       getAttribute方法

(11)       removeAttribute方法

(12)       getAttributeNames方法

HttpServletRequest接口中的Session方法

(1)                  getSession方法

publicHttpSession getSession(boolean create)

publicHttpSession getSession()

(2)           isRequestedSessionIdValid方法

(3)           isRequestedSessionIdFromCookie方法

(4)           isRequestedSessionIdFromURL方法

Application与session域范围的属性比较

       HttpSessionsession = request.getSession();

Integer sessionCount =(Integer)session.getAttribute("count");

int count = 0;

if(sessionCount != null)

{

       count= sessionCount.intValue();

}

out.println("当前会话中发生了" + (++count) + "次访问<br>");

session.setAttribute("count",newInteger(count));

             

count = 0;

ServletContext application =getServletContext();

Integer applicationCount =(Integer)application.getAttribute("count");

if(applicationCount != null)

{

       count= applicationCount.intValue();

}

out.println("WEB应用程序中发生了" + (++count) + "次访问<br>");

application.setAttribute("count",newInteger(count));

 

 

 

 

HttpSessionsession=request.getSession(true);

HttpSession session=request.getSession();

功能:如果session对象不存在,在创建session对象

如果session对象已经存在,获取session对象的引用

 

HttpSessionsession=request.getSession(false);

功能:如果session不存在,返回session对象的引用

如果session对象不存在,返回null

 

LoginServlet:

       HttpSessionsession=request.getSession();

       Session.setAttribute(“name”,name);

       转到web其他页面看商品了

BuyServlet:

       Listcart购物车

       Cart.add(good);

       HttpSessionsession=request.getSession(false);

       If(session==null){

              跳转到登录的页面

}

Session.add(cart0;

 

 

 

购物车的流程:

首页:看到所有的商品  InitServlet

1 洗衣机  800    <a href=’/demo/buyServlet?id=1’>加入购物车</a>

2  电视 800    <a href=’/demo/buyServlet?id=2’>加入购物车</a>

3 MP4  800    <a href=’/demo/buyServlet?id=3’>加入购物车</a>

4  录音机 800    <a href=’/demo/buyServlet?id=4’>加入购物车</a>

BuyServlet:

       获取到要购买的商品的id,获取对应商品对象good

List cart =newLinkedList();

Cart.add(good)

Session.setAttribute(cart);

跳转到显示购物车的页面  ListCartServlet

 

                                                                                           

原创粉丝点击