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。

       

       

 

posted @ 2021-05-30 21:40  白清欢  阅读(99)  评论(0编辑  收藏  举报