首页 > 编程语言 > 详细

Java Web 项目学习(二) 会话管理

时间:2021-05-31 00:14:43      阅读:18      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 

 

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。
      技术分享图片

       

       

 

Java Web 项目学习(二) 会话管理

原文:https://www.cnblogs.com/codinghard/p/14829032.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!