• 会话技术


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

    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

  • 相关阅读:
    php 多进程
    关于TP的RBAC的使用
    谈谈自己对于Auth2.0的见解
    php 写队列
    关于thinkphp中Hook钩子的解析
    JS的闭包
    单链表的查找和取值-1
    shell输入输出重定向
    转-Visual Studio控制台程序输出窗口一闪而过的解决方法
    linux下如何调用不同目录下的.h 库文件
  • 原文地址:https://www.cnblogs.com/Xyg12133617/p/11968865.html
Copyright © 2020-2023  润新知