ServletContext HttpSession 以及HttpServletRequest之间的关系


1. 共同点 :不管对象的作用域怎样,共享变量和获得变量的 方法都是一致的

–setAttribute(“Name”,obj1)
–getAttribute(“Name”)


2. 变量的作用域
ServletContext– 范围最大。应用程序级别的,整个应用程序都能访问,也就是只要这个服务不停止就会一直存在。
HttpSession   –  次之,会话级别的,在当前的浏览器中都能访问 不论是在同一浏览器开多少窗体,都能够访问 。可是换个浏览器就不行了。就必须又一次创建session
HttpServletRequest  – 范围最小,请求级别,请求结束,变量的作用域也结束[也就是仅仅是一次访问,访问结束,这个也结束],换句话说就是在同一浏览器请求相同接口是可以的,同一浏览器不同接口或者不同浏览器都是为null的。

  @RequestMapping("/sessiontest1")
   public void session1(HttpServletRequest request, HttpServletResponse response,HttpSession session1) throws Exception {
        // 1
        ServletContext sc = request.getServletContext();
        ServletContext sc1 = session1.getServletContext();
       System.out.println("HttpServletRequest和HttpSession获取的ServletContext是否是一个对象"+(sc==sc1));
        sc.setAttribute("sc_name", "ServletContext值");
        // 2
        HttpSession session = request.getSession();
        session.setAttribute("session_name", "HttpSession值");
        // 3
        request.setAttribute("request_name", "HttpServletRequest值");

        String sc_value = (String) sc.getAttribute("sc_name");
        String session_value = (String) session.getAttribute("session_name");
        String request_value = (String) request.getAttribute("request_name");

        System.out.println(sc_value+": "+session_value+": "+request_value);


        // request.getRequestDispatcher("MyServlet2").forward(request, response);

    }
    @RequestMapping("/sessiontest2")
    public void session2(HttpServletRequest request, HttpServletResponse response,HttpSession session1) throws Exception {
        // 1
        ServletContext sc = request.getServletContext();
        ServletContext sc1 = session1.getServletContext();
        System.out.println("HttpServletRequest和HttpSession获取的ServletContext是否是一个对象"+(sc==sc1));
        HttpSession session = request.getSession();

        String sc_value = (String) sc.getAttribute("sc_name");
        String session_value = (String) session.getAttribute("session_name");
        String request_value = (String) request.getAttribute("request_name");

        System.out.println("测试他们的作用域:  "+sc_value+": "+session_value+": "+request_value);
    }

测试流程:1. /sessiontest1    2. /sessiontest1    3. /sessiontest2     4. /sessiontest2(另外一个浏览器)

结果:

  HttpServletRequest和HttpSession获取的ServletContext是否是一个对象true

  ServletContext值: HttpSession值: HttpServletRequest值

  HttpServletRequest和HttpSession获取的ServletContext是否是一个对象true

  ServletContext值: HttpSession值: HttpServletRequest值

  HttpServletRequest和HttpSession获取的ServletContext是否是一个对象true

  测试他们的作用域: ServletContext值: HttpSession值: null

  HttpServletRequest和HttpSession获取的ServletContext是否是一个对象true

  测试他们的作用域: ServletContext值: null: null

结论:

  HttpServletRequest  仅仅是浏览器的一次访问,除非servlet做处理,比方

   request.getRequestDispatcher("Mytest").forward(request, response),就会传递。

   HttpSession用于同一浏览器,能够互相调用数据

   ServletContext 整个应用程序都能够访问.

 所以如果使用session用于用户登录就使用HttpSession保存用户信息进行其他接口的权限验证。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM