以下都是个人见解,如有不妥欢迎指出。
1.Session是什么呢???
简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session(一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建)。 同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串。
URL重定向的缺点 重定向有一些缺点:对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。
2.Cookies是什么呢???
就是服务器暂存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookies 会帮你在网站上所打的文字或是一些选择都记录下来。当下次你再访问同一个网站,Web服务器会先看看有没有它上次留下的Cookies资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你,当然还有其他作用。
3.区别
- cookie是在客户端保持状态(安全性差),而session是在服务器端保持状态(安全性高)。
- 可在客户端设置cookie的存活时间,也可在服务端设置session的存活时间,在不设置条件的情况下两者都是在浏览器关闭后消失
- session客户端也需要保存一个标识,一般通过cookie来实现的 ,如果客户端禁用了cookie ,session将使用重定向URL技术实现,就是在URL后加上 ;JSESSIONID=<%=session.getId()%> )(另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。)
如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
5.cookie的读取
- 调用request.getCookie
- 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止
例如:
- String cookieName = “userID”;
- Cookie cookies[] = request.getCookies();
- if (cookies!=null){
- for(int i=0;i<cookies.length;i++){
- Cookie cookie = cookies;
- if (cookieName.equals(cookie.getName())){
- doSomethingWith(cookie.getValue());
- }
- }
- }
String cookieName = “userID”; Cookie cookies[] = request.getCookies(); if (cookies!=null){ for(int i=0;i<cookies.length;i++){ Cookie cookie = cookies; if (cookieName.equals(cookie.getName())){ doSomethingWith(cookie.getValue()); } } }6.用途:实现自动登录
当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个
用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。
7.用途:cookie检测网站初访者
A.调用HttpServletRequest.getCookies()获取Cookie数组
B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确
C.如果是则退出循环并设置区别标识
D.根据区别标识判断用户是否为初访者从而进行不同的操作
- 使用cookie检测初访者的常见错误
但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java Web应用都可以设置cookie,依据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。
正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。
8.用途:cookie记录各个用户的访问计数
- 获取cookie数组中专门用于统计用户访问次数的cookie的值
- 将值转换成int型
- 将值加1并用原来的名称重新创建一个Cookie对象
- 重新设置最大时效
- 将新的cookie输出
由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值
但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如:
- HttpSession session = request.getSession();
- SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
- if (value= =null){
- value = new SomeImmutableClass(…); // 新创建一个不可更改对象
- }else{
- value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象
- }
- session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象
HttpSession session = request.getSession(); SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”); if (value= =null){ value = new SomeImmutableClass(…); // 新创建一个不可更改对象 }else{ value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象 } session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象10.用途:累计用户的数据
使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。
- HttpSession session = request.getSession();
- SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
- if(value = = null){
- value = new SomeMutableClass(…);
- session.setAttribute(“someIdentifier”,value);
- }else{
- value.updateInternalAttribute(…); // 如果已经存在该对象则更新其属性而不需重新设置属性
- }