会话技术

什么是会话呢?
所谓的会话过程就是指从打开浏览器到关闭浏览器的过程。

Cookie和Session指的又是什么呢?
大家都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息。如果说我们要实现购物车添加或删除商品的功能的话,我们就需要使用到Cookie和Session技术。也就是说,Cookie和Session是域对象。所谓域就相当于给存储的内容设置一个边界,将存储的内容存储到这片区域内。
什么是HttpServletResponse转发和重定向?
        因为将下面的域对象的时候会用到转发和重定向的知识点,所以在此补充一下.......

        ①.转发:转发时浏览器地址栏不会发生改变。

                      转发时浏览器发送了一次请求。

                      转发时发生在服务器内部,浏览器不知道转发的发生。

                      RequestDispatcher rd = request.getRequestDispatcher("转发到的页面");

rd.forward(request, response);

         ②.重定向:重定向时地址栏发生改变。

                           重定向时浏览器发送了两次请求。

                           重定向时发生在浏览器端的,浏览器知道重定向的发生。

                        response.sendRedirect("重定向到的页面");
Request域、ServletContext域、pageContext域、Cookie域、Session域的区别是什么?
     用在网上购买东西这个案例来剖析这个问题。

    ①.request域:表示的是一次请求范围内。

       如果说,我要去购买一件上衣向服务器发送一个购买请求,它返回给我一个购买成功的响应;当我再去购买一个裤子的时候就相当于又一个请求,那么这时候用转发的话当然就不行了,如果用重定向的话可以解决这个问题,只不过比较麻烦。然后把里面所购买的上衣的数据从request域拿出来和第二个请求拼接在一起在存入request域中。

      但是当我要去结算的,就是在另一个Servlet中,这个时候我的request域中的数据就会全部丢失。具体如下图所示:

    

②.ServletContext域和pageContext域:
      这两个域在我看来没有本质上的区别,可以理解为服务器端的共享空间。只不过说,ServletContext域表示的是整个web服务,而pageContext域表示的是一次请求。

      如果说,我要购买一件上衣,向服务器发送一个请求,服务器返回给我一个购买成功的请求 ,同样的再去购买一条裤子也是一样的。看来一切都是正常的,结算也可以去结算界面结算我的总金额。

      但是,我要说的是,因为这是一个购物界面,所以就不会只是你一个用户。因为这是一个服务器端的共享空间,所以当别人也去购买东西添加购物车后,你去结算的时候就包括自己和别人共同的东西。具体如下图所示:

③.Cookie域:

     Cookie域就是所谓的会话技术,或者说是客户端技术。

      同样去买一件上衣,这个时候就会把上衣这个对象存入的开辟的Cookie空间中, Cookie空间为此对象绑定一个唯一的标识然后以响应头方式返回给客户端,当再去购买裤子的时候会带着这个唯一标识以请求头的方式存入到Cookie空间中,同时为它绑定唯一的标识。因为Cookie域保存在自己浏览器内部,与别人互不干扰,但因为是客户端技术,所以安全性不高。具体如下图所示:

 

④.Session域

     Session域就是另一种会话技术,也叫做服务器端技术。Session的底层也是基于Cookie的,只不过有自己的改变。

     和Cookie一样,去买一件上衣,这个时候就会把上衣这个对象存入的开辟的Session空间中, Session空间为此对象生成一个唯一的Key值,当再去购买裤子的时候会带着这个唯一的Key值存入到Cookie空间中,同时为它绑定唯一的Key值。因为Session域同样保存在自己浏览器内部,与别人互不干扰,它相较于Cookie而言是服务器技术,较安全。具体如下图所示:

     

Cookie域的常用方法:
    1.获取Cookie的内容:

  Cookie[] cookies = request.getCookies();

 因为如果我们打开京东的同时,同时去打开淘宝等,这个时候就会存在多个Cookie

 2.Cookie的构造方法:Cookie(String name,String value)

 3.获取Cookie的值:String  getValue()

 4.获取Cookie的名称:String getName()

 5.设置有效的时间:void SetMaxAge(int expiry)

  ①.会话级别的Cookie:默认一个会话的时间,默认保存在浏览器内存中

  ②.持久的Cookie:把Cookie保存到磁盘上,通过(5.)设置。eg:保存用户名,QQ...等

    SetMaxAge(0):提前将Cookie结束

    前提条件:有效路径必须相同,从别的Servlet停止,首先要设置同一路径。

 6.设置有效路径: void SetPath(String url)

 7.设置有效域名:void SetDomain(String patten)

   eg:我要登录百度,那么:www.baidu.com

       登录百度书城:book.baidu.com

       SetDomain(".baidu.com");

Session域的常用方法:
  1. 如何获得session对象

    HttpSession session =request.getSession();

  2. 如何存取数据

    String age = (String)session.getAttribute("age");

      //getAttribute(String name)

     //通过Session来存入内容,然后来获取这指定的值,或添加指定的值

    session.setAttribute("age","20");

    session.removeAttribute(“age”);

   3.String  getId() 获取Session的唯一id

   4.void  invalidate() 销毁Session

原文地址:https://www.cnblogs.com/Xyg12133617/p/11968865.html