zoukankan      html  css  js  c++  java
  • Java Web 项目学习(二) 会话管理

    Cookie

    • 新建cookie对象,初始化必须有参数 Cookie cookie = new Cookie("name","value");  都是String类型
    • 设置路径生效范围 cookie.setPath("path")
    • 设置生存时间(s) cookie.setMaxAge(10)
    • 发送 response.addCookie(cookie);
    • 取对应name的Cookie的值。 @CookieValue("code") String code
    • 缺点:不太安全、每次发送耗费流量。只能存少量数据(需要来回传递,影响性能),只能存字符串(客户端识别字符串,其他类型不一定)。
      /**
         * cookie 示例
         */
        @RequestMapping(path = "/cookie/set", method = RequestMethod.GET)
        @ResponseBody
        public String setCookie(HttpServletResponse response){
            //创建cookie,将cookies存到Response对象中。
            Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
            //设置生效的范围,明确声明cookies在那些路径下有效。节省网络资源
            cookie.setPath("/community/alpha"); //在这个路径已经子路径下有用。
            //设置生存时间(存在硬盘中,长期有效)。默认情况存在内存中,浏览器关闭消失。
            cookie.setMaxAge(60 *10); //60s*10
            //发送cookie
            response.addCookie(cookie);
    
            return "set cookie";
    
        }
    
        @RequestMapping(path = "/cookie/get", method = RequestMethod.GET)
        @ResponseBody
        public String getCookie(@CookieValue("code") String code){
            System.out.println(code);
            return "get cookie";
        }

    通过以上,可以看到Cookie第一次访问时在response的header中给出


     不在范围路径下的没有code,

      

    Session

    对于浏览器访问服务器在服务器端,创建一个Session。因为有多个浏览器,因此Session也有多个。如何将Session与浏览器一一对应,就用到了Cookie。因此Session本质上式依赖于cookie的。

    在响应时,服务器自动向浏览器发送数据,通过cookie携带(服务器底层自动建立cookie,在cookie中存SessionId)。浏览器存cookie,下次请求时会发送给服务器,服务器通过sessionId找到对应的session。

    • Session 不需要手动创建,SpringMVC 会自动创建并注入。类似于 Request,Respond, Model
    • 因为Session是一直存在于服务端的,因此可以存任何类型的数据。Cookie只能字符串少量数据。因为需要来回传,影响性能
    • 优点:安全。缺点:服务端压力。
        /**
         * Session  示例
         */
        @RequestMapping(path = "/session/set", method = RequestMethod.GET)
        @ResponseBody
        public String setSession(HttpSession session){
            //Session 不需要手动创建,SpringMVC 会自动创建并注入。
            //类似于 Request,Respond, Model
            //因为Session是一直存在于服务端的,因此可以存任何类型的数据。Cookie只能字符串少量数据。因为需要来回传,影响性能。
            session.setAttribute("id","1");
            session.setAttribute("name","test");
            return "set session";
        }
        @RequestMapping(path = "/session/get", method = RequestMethod.GET)
        @ResponseBody
        public String getSession(HttpSession session){
            System.out.println(session.getAttribute("id"));
            System.out.println(session.getAttribute("name"));
            return "get session";
        }

    注意:这里只在第一次访问的时候显示。重复访问不会显示了就。

     

    使用Cookie还是Session?

    • 能用Cookie就用Cookies,减少服务端压力。
    • 没有必要存的,不要存。
    • Session对于单体服务器可以随意使用。多服务器(分布式部署)基本不用。会有问题。多个服务器会有多个session。

      • 粘性Session(浏览器请求绑定一个固定服务器) 缺点:负载不够均衡.
      • 同步Session(每个浏览器同步Session) 缺点:1同步对性能有影响,2服务器之间会产生耦合,不利于部署。
      • 共享Session(专门找一个服务器存Session,其他服务器向这台服务器申请Session) 缺点:单体服务器的瓶颈,万一挂了?搞集群的话,与同步Session相同。
      • 尽量不存Session中,能存Cookie存Cookie。对于敏感数据存到数据库中
        缺点:大部分常用的的关系型数据库,数据存在硬盘中。与内存直接读数据,性能较慢。数据量大会成为瓶颈。
      • 因此将数据存到Redis中较好。即尽量不存Session,能存Cookie存Cookie。对于敏感数据存到Redis。

  • 相关阅读:
    前端开发之初探五
    前端开发之初探四
    前端开发之初探三
    漫谈
    前端工程师的发展之路
    SVG
    前端开发之初探一
    前端开发之初探二
    详解浏览器缓存
    webStroage案例
  • 原文地址:https://www.cnblogs.com/codinghard/p/14829032.html
Copyright © 2011-2022 走看看