深入理解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的知识没说完,下节再说。

 

posted on 2017-06-10 14:38  沐雨橙风丶  阅读(345)  评论(0编辑  收藏  举报