Jsp学习8-cookie session详解及区别

来源:互联网 发布:mac关闭开机启动项 编辑:程序博客网 时间:2024/05/17 04:59

一.cookie

Cookie是存储在客户端的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持。

使用cookie的好处:

1、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
 2、Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
 3、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况进入曾经浏览过的一些站点
 4、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务

String   str   =   java.net.URLEncoder.encode("中文""UTF-8");            //编码String   str   =   java.net.URLDecoder.decode("编码后的字符串","UTF-8");   // 解码

cookie剖析

Cookie通常在HTTP信息头中设置(虽然JavaScript能够直接在浏览器中设置cookie)。在JSP中,设置一个cookie需要发送如下的信息头给服务器:

HTTP/1.1 200 OKDate: Fri, 04 Feb 2015 21:03:38 GMTServer: Apache/1.3.9 (UNIX) PHP/4.0b3Set-Cookie: name=runoob; expires=Friday, 04-Feb-07 22:03:38 GMT;                  path=/; domain=runoob.comConnection: closeContent-Type: text/html

Set-Cookie信息头包含一个键值对,一个GMT(格林尼治标准)时间,一个路径,一个域名。键值对会被编码为URL。有效期域是个指令,告诉浏览器在什么时候之后就可以清除这个cookie。
如果浏览器被配置成可存储cookie,那么它将会保存这些信息直到过期。如果用户访问的任何页面匹配了cookie中的路径和域名,那么浏览器将会重新将这个cookie发回给服务器。浏览器端的信息头长得就像下面这样:

GET / HTTP/1.0Connection: Keep-AliveUser-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)Host: zink.demon.co.uk:1126Accept: image/gif, */*Accept-Encoding: gzipAccept-Language: enAccept-Charset: iso-8859-1,*,utf-8Cookie: name=xyz

JSP脚本通过request对象中的getCookies()方法来访问这些cookie,这个方法会返回一个Cookie对象的数组。

cookie常用方法:

这里写图片描述

写入cookie三步骤:

(1)创建一个Cookie对象: 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。
Cookie cookie = new Cookie(“key”,”value”);
请务必牢记,名称和值中都不能包含空格或者如下的字符:
[ ] ( ) = , ” / ? @ : ;
(2) 设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。
cookie.setMaxAge(60*60*24);
(3) 将cookie发送至HTTP响应头中:调用response.addCookie()函数来向HTTP Set-Cookie响应头中添加cookie。
response.addCookie(cookie);

读取cookie

Cookie文件创建好后,用的时候需要把它读出来

<% Cookie cookies[]=request.getCookies(); //读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组里面Cookie sCookie=null; String svalue=null; String sname=null; for(int i=0;i< cookies.length-1;i++{    //用一个循环语句遍历刚才建立的Cookie对象数组sCookie=cookies[i];   //取出数组中的一个Cookie对象sname=sCookie.getName(); //取得这个Cookie的名字svalue=sCookie.getValue(); //取得这个Cookie的内容%><% } %>  name    value<%=name%>%=svalue%>

这一小段JSP文件可以读出用户硬盘上的所有有效的Cookie,也就是仍然在存活期内的Cookie文件。并用表格的形式列出每个Cookie的名字和内容。

我们来逐行分析一下这段代码:
Cookie cookies[]=request.getCookies() 我们用request.getCookies()读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组里面。
接下来我们用一个循环语句遍历刚才建立的Cookie对象数组,我们用sCookie=cookies[i]取出数组中的一个Cookie对象,然后我们用sCookie.getValue()和sCookie.getName()两个方法来取得这个Cookie的名字和内容。

通过将取出来的Cookie的名字和内容放在字符串变量中,我们就能对其进行各种操作了。在上面的例子里,可通过循环语句的遍历,将所有Cookie放在一张表格中进行显示。

设置Cookie的存在时间,及删除Cookie

   在JSP中,使用setMaxAge(int expiry)方法来设置Cookie的存在时间,参数expiry应是一个整数。正值表示cookie将在这么多秒以后失效。注意这个值是cookie将要存在的最大时间,而不是cookie现在的存在时间。负值表示当浏览器关闭时,Cookie将会被删除。零值则是要删除该Cookie。如:

  <%   Cookie deleteNewCookie=new Cookie("newcookie",null);   deleteNewCookie.setMaxAge(0); //删除该Cookie   deleteNewCookie.setPath("/");    response.addCookie(deleteNewCookie);  %>   

需要注意的一些问题

通过上面两个简单的例子,可以看到,用JSP进行Cookie的操作,是非常简单的。不过我们在实际操作中还要注意一些问题:
1. Cookie的兼容性问题
Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。
2. Cookie的内容
同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定Cookie的内容为”Test_Content”的原因。
虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符。(

二.session

HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息。
有三种方法来维持客户端与服务器的会话:
Cookies
网络服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求。
这可能不是一种有效的方式,因为很多时候浏览器并不一定支持cookie,所以我们不建议使用这种方法来维持会话。
隐藏表单域
一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,就像下面这样:

<input type="hidden" name="sessionid" value="12345">

这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。
这种方式可能是一种有效的方式,但点击< A HRE F>标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。
重写URL
您可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。
举例来说,http://w3cschool.cc/file.htm;sessionid=12345, session标识符为sessionid=12345,服务器可以用这个数据来识别客户端。
相比而言,重写URL是更好的方式来,就算浏览器不支持cookies也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。

session对象

除了以上几种方法外,JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。
默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:

<%@ page session="false" %>

JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。
下表列出了session对象的一些重要方法:
这里写图片描述

Session应用

这个例子描述了如何使用HttpSession对象来获取创建时间和最后一次访问时间。我们将会为request对象关联一个新的session对象,如果这个对象尚未存在的话。

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*" %><%   // 获取session创建时间   Date createTime = new Date(session.getCreationTime());   // 获取最后访问页面的时间   Date lastAccessTime = new Date(session.getLastAccessedTime());   String title = "再次访问菜鸟教程实例";   Integer visitCount = new Integer(0);   String visitCountKey = new String("visitCount");   String userIDKey = new String("userID");   String userID = new String("ABCD");   // 检测网页是否由新的访问用户   if (session.isNew()){      title = "访问菜鸟教程实例";      session.setAttribute(userIDKey, userID);      session.setAttribute(visitCountKey,  visitCount);   } else {       visitCount = (Integer)session.getAttribute(visitCountKey);       visitCount += 1;       userID = (String)session.getAttribute(userIDKey);       session.setAttribute(visitCountKey,  visitCount);   }%><html><head><title>Session 跟踪</title></head><body><h1>Session 跟踪</h1><table border="1" align="center"> <tr bgcolor="#949494">   <th>Session 信息</th>   <th></th></tr> <tr>   <td>id</td>   <td><% out.print( session.getId()); %></td></tr> <tr>   <td>创建时间</td>   <td><% out.print(createTime); %></td></tr> <tr>   <td>最后访问时间</td>   <td><% out.print(lastAccessTime); %></td></tr> <tr>   <td>用户 ID</td>   <td><% out.print(userID); %></td></tr> <tr>   <td>访问次数</td>   <td><% out.print(visitCount); %></td></tr> </table> </body></html>

试着访问 http://localhost:8080/testjsp/main.jsp ,第一次运行时将会得到如下结果:
这里写图片描述
再次访问,将会得到如下结果:
这里写图片描述

删除Session数据

当处理完一个用户的会话数据后,您可以有如下选择:
移除一个特定的属性:
调用public void removeAttribute(String name) 方法来移除指定的属性。
删除整个会话:
调用public void invalidate() 方法来使整个session无效。
设置会话有效期:
调用 public void setMaxInactiveInterval(int interval) 方法来设置session超时。
登出用户:
支持servlet2.4版本的服务器,可以调用 logout()方法来登出用户,并且使所有相关的session无效。
配置web.xml文件:
如果使用的是Tomcat,可以向下面这样配置web.xml文件:

  <session-config>    <session-timeout>15</session-timeout>  </session-config>

超时以分钟为单位,Tomcat中的默认的超时时间是30分钟。
Servlet中的getMaxInactiveInterval( ) 方法以秒为单位返回超时时间。如果在web.xml中配置的是15分钟,则getMaxInactiveInterval( ) 方法将会返回900。

三.cookie与session区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
详细的区别看:http://blog.csdn.net/axin66ok/article/details/6175522

参考:http://blog.csdn.net/springsen/article/details/7833582
http://blog.csdn.net/lulei1217/article/details/50954351
http://www.runoob.com/jsp/jsp-cookies.html
https://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 辞职不干了保险怎么办 卤菜保存十天怎么办 做卤菜生意差怎么办 快五岁孩子不爱学习怎么办 孩孑不爱学习怎么办 出入境预约没去怎么办 第一志愿没录取怎么办 公需考试不合格怎么办 有个神经病妈妈怎么办 妈妈精神有问题怎么办 健身后肌肉酸痛怎么办 造价员证过期了怎么办 安全员c证到期怎么办 建造师挂靠社保怎么办 造价员过期没审怎么办 苹果6屏幕不灵怎么办 苹果触屏不灵敏怎么办 苹果6外屏掉了怎么办 苹果6外屏摔碎了怎么办 苹果6内屏坏了怎么办 iphone6触屏失灵怎么办 6s手机乱跳屏怎么办 苹果手机乱码了怎么办 苹果6手机乱跳屏怎么办 魅族mx3跳屏怎么办 小米4跳屏怎么办 5s触摸屏不灵敏怎么办 平板触屏失灵怎么办 平板触屏不灵敏怎么办 苹果5触摸屏失灵怎么办 苹果6plus 失灵怎么办 苹果手机中病毒怎么办 苹果屏幕碎一点怎么办 苹果se手机进水怎么办 苹果6splus弯曲怎么办 苹果手机屏失灵怎么办 iphone7屏幕碎了怎么办 iwatch屏幕刮花怎么办 iwatch2碎屏了怎么办 iwatch配对不上怎么办 苹果手机6进水怎么办