Cookie/Session详解

来源:互联网 发布:淘宝账号注销手机号 编辑:程序博客网 时间:2024/05/16 23:50

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话,常用的会话跟踪技术是Cookie与Session,Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份

Cookie机制

在程序中,会话跟踪是很重要的事情,理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆,而Web应用程序是使用HTTP协议传输数据的,HTTP协议是无状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话

Cookie就是这样的一种机制,它可以弥补HTTP协议无状态的不足,在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话

什么是Cookie?

Cookie实际上是一小段的文本信息,客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,客户端浏览器会把Cookie保存起来,当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态,服务器还可以根据需要修改Cookie的内容

查看网站的Cookie:

查看某个网站颁发的Cookie很简单,在浏览器地址栏输入JavaScript:alert (document. cookie)就可以了(需要有网才能查看),JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容,如图1.1所示:

注意:Cookie功能需要浏览器的支持,如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效,不同的浏览器采用不同的方式保存Cookie

保存的位置:

1.保存在客户端浏览器的内存中,关闭浏览器,Cookie就不存在了

2.保存在PC的硬盘上,设置有效时间

IE浏览器会在”C:\Documents and Settings\你的用户名\Cookies”文件夹下以文本文件形式保存,一个文本文件保存一个Cookie

Cookie作为浏览器对象,是保存在客户端的小文本,可以保存客户端数据(少量),每个cookie所存放的数据不会超过4KB,而每个cookie文件不会超过300个coookie

Cookie的使用

1.创建Cookie对象:

Cookie newCookie = new Cookie(String key,Object value);

2.写入Cookie对象:

response.addCookie(newCookie);

3.读取Cookie对象:

Cookie[] cookies = request.getCookies();

常用方法:

void setMaxAge(int expiry);//设置cookie的有效期,以秒为单位void setValue(String value);//对cookie进行赋值String getName();//获取cookie的名称String getValue();//获取cookie的值int getMaxAge();//获取cookie的有效时间,以秒为单位

Cookie的中文乱码问题:

将中文进行编码再放入cookie中:String username1 = URLEncoder.encode(username, "utf-8");String userpwd1 = URLEncoder.encode(userpwd, "utf-8");//其中username和userpwd其中有中文,username1和userpwd1是进行编码之后的字符串
解码(如果不进行解码,页面会获取的是base64编码后的内容)String unamePwd = URLDecoder.decode(cookies[i].getValue(),"utf-8"); //其中cookies[i].getValue()是要进行解码的内容,根据自己的情况进行修改
<%//一个有中文内容的Cookie:String str = "我们都有一个家,名字叫中国!";Cookie cookie = new Cookie("name", URLEncoder.encode(str, "UTF-8"));response.addCookie(cookie);//取出Cookie中的中文内容:Cookie [] cookies = request.getCookies();String str = "";for(int i=0;i<cookies.length;i++){    if(cookies[i].getName().equals("name")) {        str = cookies[i].getValue();    }}out.println(URLDecoder.decode(str, "UTF-8"));%>

Session机制

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态,Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力

session原理:

服务端保存session的内容,客户端浏览器cookie保存sessionid,服务端通过客户端每次http请求带上cookie中的sessionid去找对应此用户的session内容

Session机制决定了当前客户只会获取自己的Session,而不会获取别人的Session,各客户的Session也彼此独立,互不可见

Session的使用

HttpSession session = request.getSession();  //获取Session对象session.setAttribute("loginTime", new Date());  //设置Session中的属性(Date)session.getAttribute("loginTime"));  //获取Session属性

Session的常用方法:

void setAttribute(String attribute,Object value)//设置Session属性,value参数可以为任何Java Object,通常为Java Bean,value信息不宜过大String getAttribute(String attribute)//返回Session属性Enumeration getAttributeNames()//返回Session中存在的属性名void removeAttribute(String attribute)//移除Session属性String getId()//返回Session的ID,该ID由服务器自动创建,不会重复long getCreationTime()//返回Session的创建日期,返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime())long getLastAccessedTime()//返回Session的最后活跃时间,返回类型为longint getMaxInactiveInterval()//返回Session的超时时间,单位为秒,超过该时间没有访问,服务器认为该Session失效void setMaxInactiveInterval(int second)//设置Session的超时时间,单位为秒boolean isNew()//返回该Session是否是新创建的void invalidate()//使该Session失效,Tomcat中Session的默认超时时间为20分钟,通过setMaxInactiveInterval(int seconds)修改超时时间,可以修改web.xml改变Session的默认超时时间,例如修改为60分钟:<session-config>   <session-timeout>60</session-timeout> <!-- 单位:分钟 --></session-config>注意:<session-timeout>参数的单位为分钟,而setMaxInactiveInterval(int s)单位为秒

URL地址重写:

URL地址重写是对客户端不支持Cookie的解决方案,URL地址重写的原理是将该用户Session的id信息重写到URL地址中,服务器能够解析重写后的URL获取Session的id,这样即使客户端不支持Cookie,也可以使用Session来记录用户状态,HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写

<td>    <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>">     Homepage</a></td>

该方法会自动判断客户端是否支持Cookie,如果客户端支持Cookie,会将URL原封不动地输出来,如果客户端不支持Cookie,则会将用户Session的id重写到URL中,重写后的输出可能是这样的:

<td>    <a href="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=1&wd=Java">Homepage</a></td>

如果是页面重定向(Redirection),URL地址重写可以这样写:

<%    if(“administrator”.equals(userName)){       response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));        return;    }%>

对于WAP程序,由于大部分的手机浏览器都不支持Cookie,WAP程序都会采用URL地址重写来跟踪用户会话,比如用友集团的移动商街等

注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie,尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid,当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了

Session中禁止使用Cookie:

既然WAP上大部分的客户浏览器都不支持Cookie,索性禁止Session使用Cookie,统一使用URL地址重写会更好一些,Java Web规范支持通过配置的方式禁用Cookie,下面举例说一下怎样通过配置禁止使用Cookie:

打开项目sessionWeb的WebRoot目录下的META-INF文件夹(跟WEB-INF文件夹同级,如果没有则创建),打开context.xml(如果没有则创建),编辑:

<?xml version='1.0' encoding='UTF-8'?><Context path="/sessionWeb"cookies="false"></Context>

或者修改Tomcat全局的conf/context.xml,修改内容如下:

<!-- The contents of this file will be loaded for eachweb application --><Context cookies="false">    <!-- ... 中间代码略 --></Context>

注意:该配置只是禁止Session使用Cookie作为识别标志,并不能阻止其他的Cookie读写,也就是说服务器不会自动维护名为JSESSIONID的Cookie了,但是程序中仍然可以读写其他的Cookie

Session与Cookie对比

session:保存在服务器端,保存的是Object类型,会话结束则数据销毁,保存重要信息cookie:保存在客户端,保存的是String类型,可以长期保存在客户端,保存不重要信息

推荐的参考博客:http://blog.csdn.net/daochuwenziyao/article/details/55061328

0 0