原文链接:http://blog.csdn.net/u012426959/article/details/78898752
一.cookie
Cookie是存储在客户端的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持。
使用cookie的好处:
1、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
2、Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
3、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况进入曾经浏览过的一些站点
4、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务
JSP Cookie 处理需要对中文进行编码与解码,方法如下:
- 1
- 2
cookie剖析
Cookie通常在HTTP信息头中设置(虽然JavaScript能够直接在浏览器中设置cookie)。在JSP中,设置一个cookie需要发送如下的信息头给服务器:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Set-Cookie信息头包含一个键值对,一个GMT(格林尼治标准)时间,一个路径,一个域名。键值对会被编码为URL。有效期域是个指令,告诉浏览器在什么时候之后就可以清除这个cookie。
如果浏览器被配置成可存储cookie,那么它将会保存这些信息直到过期。如果用户访问的任何页面匹配了cookie中的路径和域名,那么浏览器将会重新将这个cookie发回给服务器。浏览器端的信息头长得就像下面这样:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
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文件创建好后,用的时候需要把它读出来
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
这一小段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。如:
- 1
- 2
- 3
- 4
- 5
- 6
需要注意的一些问题
通过上面两个简单的例子,可以看到,用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,就像下面这样:
- 1
这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在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来实现,就像下面这样:
- 1
JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。
下表列出了session对象的一些重要方法:
Session应用
这个例子描述了如何使用HttpSession对象来获取创建时间和最后一次访问时间。我们将会为request对象关联一个新的session对象,如果这个对象尚未存在的话。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
试着访问 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文件:
- 1
- 2
- 3
超时以分钟为单位,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