<Web> Session和Cookie

前言

  session和cookie对于web开发来说,即陌生有熟悉,熟悉是指经常碰到,比如request.getSession(),request.getCookie(),session.setAttribute()等等都能见到,陌生是指从来不知道他们真正是什么,不能说出个所以然来。那其实我在这个问题也是迷茫了非常久了,希望能借这篇随笔来理理。

  由于Http是无状态协议,就是说对事物没有记忆能力,如果后续的操作需要前面的信息(经典的如购物车),则需要重新传入,这回导致每次连接的数据量增大,所以就需要一个能保持http连接的技术,于是session和cookie就出现了。

cookie理解

  先来看cookie,首先明白它的作用:当用户通过http访问服务器时,服务器会将一个k/v值返回给客户端(浏览器),并给这些数据加上一些约束(也就是除了name/value之外的参数),那么返回给浏览器的数据存下来干嘛呢?当然是为了判断下次访问的时候是不是同一个人,如果是同一个人的话,那么就考虑程序中有些设计可以优化一下,就像刚到过你家的人,马上又回来的话,当然和接待新来的客人不一样了。

  那么cookie是怎么工作的呢,在servlet技术中,已经提供了非常好的cookie支持。

  下面是java servlet包里的cookie类源码段,从这里可以看出cookie有哪些属性。

  

  我们可以设置自己的cookie属性,new Cookie(String name, String value)即可,但是要注意不可以和version 0或1里面的保留字段一样,否则抛异常,源码如下:

  

  获取和返回cookie的示例如下:

String getCookie(Cookie[] cookies, String key){
    if(cookies != null){
        for(Cookie cookie : cookies){
            if(cookie.getName().equals(key)){
                return cookie.getValue();
            }
        }
    } 
    return null;
}

@override
public void doGet(HttpServletRequest request, 
                            HttpServletResponse response){
    Cookie[] cookies = request.getCookies();
    String userName = getCookie(cookies, "username");
    String userAge = getCookie(cookies, "userAge");
    if(userName == null){
        response.addCookie(new Cookies("userName", "larry"));
    }
    if(userName == null){
        response.addCookie(new Cookies("userAge", "24"));
    }
    response.getHeaders("Set-Cookie");
}

    

  Cookie有两个缺点:

  1.不安全,cookie从本质上来说,是服务器修改了本地的文件,任何人都不希望自己的电脑的文件在自己不知道情况下被修改,还有就是可以修改cookie的值。

  2.占用宽带,虽然很多浏览器限制了cookie的大小,比如4K左右,但是如果网站的pv量很大,大量访问服务器的连接数据就非常大,非常占用宽带。(虽然cookie和response body一样可以压缩大小)

Session理解

  为了解决上述问题,session就用上了。session将本来存在客户端的信息存在了服务器,然后分配一个id给客户端,这个Id默认叫:JSESSIONID。所以,用户再次访问服务器的时候,只要带上id,服务器就知道是哪个用户来访问了。

  在Tomcat中,由Manager来管理所有session生命周期:

  1.session过期,则由GC回收(tomcat默认设置60s, 当设置为-1的时候,就不会过期,但要慎重考虑内存空间是否足够的问题)

  2.服务器关闭,由Tomcat持久化到磁盘

  在serlvet中,我们直接调用request.getSession(false),也可以得到对象,这是因为jsp默认有一句<%@page HttpSession session = request.getSession(true);%>,所以在jsp编译成servlet的时候,就已经创建好了session对象。当然由于session是占用资源的,所有如果不需要的话,可以在jsp中<%@page session = "false"%>来关闭。

  session自己也有缺点:多台服务器之间不能共享。这里不展开说明。

 

坑爹啊!

  太背了!码这篇随笔花了蛮久的时间,但是就在刚才在提交的时候,没注意自己是FQ状态,就一直卡在哪里提交不了(坑爹啊!为什么博客园墙外提交不了?!),下掉墙之后,页面直接错误,返回一看,打了半天的全没了。气的不行,又不想白白浪费那么久时间,就随便再写了点,凑合看吧,以后一定要注意了!

posted @ 2015-04-08 12:41  丶千纸鸢  阅读(153)  评论(0编辑  收藏  举报