• 深入理解Session与Cookie(一)


    Session,Cookie简介:

    Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷:

    Cookie:

    随着Cookie的个数的增多和访问量的增加,它占用的网络带宽很大,假设一个Cookie占用100字节,如果一天的PV有几亿,那么它得占多少带宽?

    Session:

    Session的致命弱点在于不容易在多台服务器之间共享,这也限制了Session的使用。

    理解Cookie:

    当一个用户通过HTTP访问一个服务器时,这个服务器将一些Key/Value的键值对返回客户端浏览器,当这个用户再次访问服务器时,数据又被完整的带回服务器。

    当前Cookie有两个版本:Version0和1,响应头设置的标识也不同:Set-Cookie,Set-Cookie2,属性也有些不同(Servlet3.0规范支持Version1)。

    Cookie如何工作:

     @RequestMapping(value = "/testCookie")
        public Object testCookie(HttpServletRequest request, HttpServletResponse response) {
            Cookie[] cookies = request.getCookies();
            String userName = getCookie(cookies, "userName");
            String userAge = getCookie(cookies, "userAge");
            if (userName == null) {
                response.addCookie(new Cookie("userName", "zhangsan"));
            }
            if (userAge == null) {
                response.addCookie(new Cookie("userAge", "18"));
            }
            return response.getHeaders("Set-Cookie");
        }
    
        private String getCookie(Cookie[] cookies, String key) {
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if (key.equals(cookie.getName())) {
                        return cookie.getValue();
                    }
                }
            }
            return null;
        }

     访问后,得到如下输出,说明每次创建Cookie时都会创建一个Header。

    具体是怎么实现的,根据源码得知,真正构建Cookie是在Tomcat的catalina.jar中的Response类中完成的,该类实现了HttpServletResponse接口。

    generateCookieString中由CookieProcessor.generateHeader()方法来进行Cookie到String的转换。

    接着执行addHeader方法,addHeader()里调用了MimeHeaders.addValue(name)方法,由MessageBytes.setString(value)设置值,待到真正响应时由Http11Processor.prepareResponse()方法来进行预处理,按顺序的写入字节流中返回。

    
    
    
    

     好了,整个Cookie的创建到响应的过程就到此结束了,有兴趣的朋友们可以自行研究一波源码。

    Cookie的限制:

    Cookie是HTTP头中的一个字段,虽然Http本身对这个字段没有多少限制,但是Cookie最终是存在浏览器中的,所以不同的浏览器对Cookie的存储都有一些限制。

    浏览器版本 Cookie的数量限制(每个域名) Cookie的总大小限制
    IE6 20 4095字节
    IE7 50 4095字节
    IE8 50 4095字节
    IE9 50 4095字节
    Chrome 50 大于80000
    FireFox 50 4097个字节

    所以说,当如果想在IE上使用Cookie来存储很长一段信息的时候就得注意了,超出长度的部分会被截断,当然一般只有初创公司会这么干^_^(我就被坑过一次)。

    还有一些Cookie的知识没说完,下节再说。

  • 相关阅读:
    记一次生产数据库"意外"重启的经历
    我爬了链家青岛市北3000套二手房得出一个结论
    我用Python实现了一个小说网站雏形
    Linux下安装 Python3
    Lepus搭建企业级数据库慢查询分析平台
    Lepus搭建企业级数据库全方位监控系统
    shell浅谈之九子shell与进程处理
    shell中测试命变量是否已经定义
    getline数据来源你的三种方式
    awk中的system和getline的用法
  • 原文地址:https://www.cnblogs.com/liuchuanfeng/p/6978704.html
Copyright © 2020-2023  润新知