众所周知,Session和Cookie是在用来保存用户数据的技术,我们得引入“会话”这个概念, 一次“会话”是用户打开浏览器进行一系列操作后,关闭浏览器的过程。在会话过程中,我们用到Session,Cookie 去保存用户数据,这是共同点。
我们来说说他们的区别(大致的理解):
cookie:是作用在客户端的技术。
session:是依赖在服务器端的技术。
首先,来看一下cookie:
一.cookie是javax.servlet.http.Cookie类的对象;
构造方法:Cookie(String name,String value);
二.cookie能保存数据,并且通过属性设置可以永久的保存数据,
三.cookie是存放在客户端的文件中的(路径自己指定,当然不指定就有默认的路径---/主机/端口号/项目名称/包名/文件名);
那么客户端是通过哪种路径去读文件的呢?
答:
1.当设置cookie的path是"/"的时候,那么客户端读取cookie的时候,是按照(以本地例)http://localhost:xxxx/去读cookie文件的,也就是说,web容器中的所有web应用都可以读取这个cookie文件数据;
2.当设置的是"/项目名称",那么只有这一个项目能够访问;
3.默认设置(上面写了),只有具体的类能够访问。
*---这里写一下客户端携带cookie去访问服务器取得cookie添加cookie的过程,加深一下对整个过程的理解:(没画图)
1.客户端发出一个请求,生成一javax.servlet.http.Request对象request和javax.servlet.http.Response对象response;
2.web容器收到了客户端的请求,发送给服务器,期间request对象携带cookie到达了服务器;
3.服务器通过调用request对象的getCookies方法来获取所有的cookie并且对其进行解析,解析完成后,通过response的addCookie方法添加一个Cookie对象(键-值)---在创建cookie的时候我们就可以通setMaxAge(int age)setPath(string path)指定其存活期和保存cookie文件的目录;
4.request经过转发后使命终结,response经过服务器的转发,回到了客户端,response将其携带的cookie信息告诉客户端,客户端浏览器在指定路径下保存cookie的文件中添加cookie数据;
5.一次请求和响应结束。
*首先得知道:cookie是存放在客户端的在Documents and Settings 目录下的用户文件中,以.txt文件的形似存在;
*其次,客户端发出request请求是携带者Cookie数据到达服务器的;
*最后是,是response对象携带者服务器添加的cookie到达客户端,并最后写入文件中的。
下来是Session:
session是在服务器端的会话技术,
一.对应javax.servlet.http.HttpSession类;
获取方式:1.通过request的getSession();
2.通过request的getSession(boolean create);
以上方式的区别:和hibernate中的获取session的两种方式getCurrentSession()和openSession()类似,第一个:获取当前servlet上下文的的session,如果存在session,那么获取,如果不存在,创建一个新的,第二个:通过传递参数来设置当Servlet上下文中不存在session,是否要创建session,true:创建,false:不创建。
二.session也可以保存数据,但是数据的最长有效期只有30min(这里指的是闲session 30min),虽然可以设置但是也得不会超过30min.
三.session存放在服务器的缓存中,这里得说说session的状态,
1.被创建状态,---通过上面的方法获取并初始化。
2.存在内存中的活跃状态。
---被使用时候,存放在内存中,服务器没有关闭。
3.序列化到磁盘的状态
---当关闭服务器的时候,session就会被序列化到硬盘上,以不可读文件的形式存在,具体在服务器(tomcat)的/work/catalina/localhost/项目名目录下,当再次重启服务器的时候,文件文件就会消失,数据被读到内存中。
4.销亡状态 --可以通过web.xml进行配置
<session-config>
<session-timeout>单位/分钟..
...
</...>
</...>
*设置的时间超不过30min,这里还得说说,session到底什么时候消亡?
答:有些人认为是:当浏览器关闭的时候消亡---这种理解是错误的,其实是在配置的时间到的时候消亡,如果没有配置消亡时间,那么就是在“闲置”session 30min后自动消亡。
*---这里和上面一样通过描述,服务器端设置session后对用户数据共享的过程,来加深对session的理解:
1.服务器接收到客户端发来的请求后,通过request对象来向整个servlet上下文写通过session写共享数据,
2.写完后,这个数据保存在服务器端(web容器)---在生成session的过程中,生成一个唯一的标示这个session的sessionID,并且生成了一个cookie形式
为:JSESSIONID=sessionID,服务器通过response把这个cookie响应给客户端。
3.客户端收到cookie数据,然后把数据写到了客户端cookie文件中。
4.当客户端在向服务器request发起请求的时候,就像上面所说的那样,request请求会携带者cookie数据一同到达服务器。
5.当要获取session的中的数据的时候,服务器就会对request携带的cookie进行解析,得到name=JSESSIONID的cookie的value值,这个value值是在服务器端存放的session的sessionID,服务器通过把内存中的session的sessionID和在request请求中获取的sessionID进行对比,得到这个session对应的数据,这样就实现了对数据的保存和对用户程序的共享。
到此,个人理解陈述完毕,希望大家指正其中错误的观点,共勉。
至于session和cookie的应用就不多说了。
写之记录记录,。。。。