session和cookie对于web开发来说,即陌生有熟悉,熟悉是指经常碰到,比如request.getSession(),request.getCookie(),session.setAttribute()等等都能见到,陌生是指从来不知道他们真正是什么,不能说出个所以然来。那其实我在这个问题也是迷茫了非常久了,希望能借这篇随笔来理理。
由于Http是无状态协议,就是说对事物没有记忆能力,如果后续的操作需要前面的信息(经典的如购物车),则需要重新传入,这回导致每次连接的数据量增大,所以就需要一个能保持http连接的技术,于是session和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将本来存在客户端的信息存在了服务器,然后分配一个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状态,就一直卡在哪里提交不了(坑爹啊!为什么博客园墙外提交不了?!),下掉墙之后,页面直接错误,返回一看,打了半天的全没了。气的不行,又不想白白浪费那么久时间,就随便再写了点,凑合看吧,以后一定要注意了!