谈一下cookie和session

来源:互联网 发布:淘宝网保障基金 编辑:程序博客网 时间:2024/06/01 16:16

最近又学习了一下cookie和session的知识,感觉进步不少,记录下来,以后忘了的时候也能翻一翻。

谈到cookie和session之前,不得不提到另外一个技术,就是会话技术。何为会话,从打开浏览器访问某个服务器开始,然后一直访问这个服务器的web资源,最后关闭浏览器后,这就是是一次完整会话。特别注意的是,这里一定是关闭浏览器之后才是会话的接口,不要理解成关闭标签页,关闭标签页会话是没有结束的。会话技术就是记录客户端的状态和数据的,而cookie和session就能实现保存会话数据。

Cookie,保存到客户端浏览器的会话技术。cookie的构造方法,Cookie cookie = new Cookie(String name,String value)。可以理解成cookie也是键值对一样存在的。cookie.setPath()方法设置cookie的路径,即访问这个路径或这个路径的子路径才会带着浏览器的cookie。cookie.setMaxAge()设置cookie的时间,如果不设置默认的cookie时间是一次会话,即会话结束cookie就不在浏览器保存了,设置了时间之后,cookie的过期时间就不再是会话结束了,而是到了设置的时间才过期。理解这些语法后,需要知道两个问题1.服务器怎样获得客户端http请求传来的cookies,只有一个方法,就是request.getCookies,返回的是一个cookie数据,想获取具体name的cookie,需要for循环这个cookie数据,用equals判断。2.服务器怎么返回一个cookie给客户端浏览器呢,这个方法是response.addcookie(cookie)。当使用了构造方法创建出来cookie,并且设置了该cookie的过期时间和路径之后,添加到response里就可以返回给服务器了。

Session,保存到服务器的会话技术。服务器为每个浏览器单独开辟一块存储区域,一个用户打开多个浏览器访问同一个服务器,服务器会各自为浏览器分别创建属于浏览器的session区域,它们的session区域是互不干扰的。当用户客户端浏览器访问服务器想保存数据时,这时候服务器会把数据保存到浏览器对应的session区域中。只要会话没有结束,访问服务器其他程序时也可以拿到这个服务器的session区域的数据,为用户提供服务。有个问题来了,服务器什么时候创建session?服务器很智能的,并不是浏览器随便访问一个服务器的资源就创建了session,因为这样太浪费服务器内存了。当第一次调用request.getSession的时候,服务器会创建session,以后再次调用session的时候,服务器就不会创建session了,而是获取这个session。而这些是怎么实现的呢,内部原理就是   :访问request.getSession的时候,服务器判断浏览器有没有传来的键为JSESSIONID的cookie,因为第一次访问没有传过来JSESSIONID,所以服务器智能的创建了一个session区域,比如这块session区域的唯一标示是123456789,创建完了之后会自动返回浏览器这个唯一标示,这时候的http响应就变成了。当浏览器再次访问服务器的时候,会带着这个cookie访问。why,因为这个cookie的路径是项目名,并且没有设置cookie的过期时间,代表cookie在会话结束时消失。所以访问这个项目的资源都会带着这个cookie,再次访问request.getSession的时候,服务器智能的判断已经有了session区域了,就不会创建一个新的session给客户端浏览器了。说到底为什么服务器这个智能判断已经存在该session了,就是因为第二次之后的浏览器访问服务器,都会带着JSESSIONID这个cookie,服务器就是根据这个JSESSIONID的cookie判断用不用创建session。服务器创建完session返回给客户端浏览器一个JSESSIONID的cookie,和服务器拿到浏览器的JSESSIONID的cookie 查询session区域 这两个步骤都是服务器自动完成的,不需要我们操心。说到这里,其实JSESSIONID的cookie可以理解成一个比较特殊的cookie,它的路径是项目名,过期时间是会话结束,它是服务器第一次访问request.getSession的时候自动创建返回客户端的。再一次会话内再次访问该项目的其他资源都会带着这个cookie,服务器就根据这个cookie来查找到服务器保存的session数据。

再提一个问题,如果我们浏览器清除所有cookie,再次访问服务器的时候还能找到之前创建的session吗?答案当然是否定的,因为服务器就是根据JSESSIONID的cookie查询session区域的,而清除所有的cookie之后访问服务器就不带着JSESSIONID的cookie,肯定找不到服务器中的session区域了。但是需要注意的是,这个session区域是肯定存在的,至于为什么存在一会讲session的销毁就知道了,只是没有JSESSIONID的cookie,查询不到这个session区域了。

最后说一个语法问题就是session的生命周期,创建:大家应该都知道了,就是第一次执行request.getSession的时候创建出来的session。销毁:有三种方式。1.服务器非正常关闭,这个很好理解 session区域存在服务器里,服务器都关闭了,session区域也没了。但是为什么是非正常关闭呢,以为正式关闭可能session区域存在持久化的可能性,这个就不讨论了。2session的默认过期时间是30分钟,是在tomcat的web.xml中配置的,我们也可以改成1分钟,那么session就1分钟销毁。这时候又有一个问题,这个过期时间从何时开始计算30分钟呢?是打开服务器的时间?还是第一次访问request.getSession?还是退出会话的时候?答案都不是,是从不操作服务器的web资源开始计时。

3.session.invalidate()方法。

session的作用范围,默认在一次会话中,也就是说在一次会话中任何资源共用一个session对象。这个也很好理解为什么是一次会话,因为JSESSIONID的cookie过期时间是会话结束,没有JSESSIONID,访问服务器request.getSession的时候服务器就会判断出来需要创建一个session区域返回客户端浏览器,而之前的session或许还存在,但是找不到它了,所以session的作用范围是一次会话,本质就是JSESSIONID的作用范围是一次会话。

哈哈,第一次发布文章,希望是个好的开始吧;