详细介绍Jsp中的Cookies

开发 后端
本文介绍的是JSP中的cookies,希望对你有帮助,一起来看。

在开发网站应用程序的过程中,使用cookie记录用户的一些信息是比较常用的一种方法,而cookie的使用也非常简单。

一、Cookie是通过HttpServletResponse的addCookie方法加入到Set-Cookie应答头中的

例如:

  1. Cookie userCookie = new Cookie("user""admin");   
  2. response.addCookie(userCookie); 

和设置有关系的还有以下两个重要方法

1.setMaxAge

设置Cookie过期之前的时间,以秒计。如果不设置该值,则Cookie只在当前会话内有效,而且这些Cookie不会保存到磁盘上。

注意:删除cookie就是通过该方法实现的。将要删除的cookie的过期之前的时间指定为0就可以达到删除该cookie的目的。

2.setPath

设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面(jsp(SUN企业级应用的***)页面或者Servlet的映射)所在目录及其子目录下的所有页面。

注意:

A:所有的cookie都是有路径的

B:该方法设置的路径为客户端路径,即“/”代表服务器根目录,而不是WEB应用根目录

C:该方法设置路径时,“/myWeb/”与“/myWeb”是不同的,要特别注意;前者可以关联到服务器的myWeb目录下,而后者则不可以。

D:该方法设置路径时,没有相对目录可言,即不论在哪个目录下设置setPath(“/myWeb/”),该cookie都将关联到服务器的myWeb目录下(setPath(“/myWeb”)则不可以),而不是当前目录的myWeb的子目录下;同样,设置setPath(“myWeb/”)和setPath(“myWeb”)也不能关联到当前目录的myWeb的子目录下。

这里有个奇怪的例子,就是在一个web应用下设置的cookie可以在另一个web应用下获得(两个web应用在同一个服务器下)
目录结构:在服务器根目录上有web1和web2两个目录,在web1下有setcookie.jsp(SUN企业级应用的***)和getcookie.jsp(SUN企业级应用的***)、在web2下有getcookie.jsp(SUN企业级应用的***)

web1下的setcookie.jsp(SUN企业级应用的***)

  1. <%  
  2. Cookie userCookie = new Cookie("user""admin");   
  3. userCookie.setMaxAge(24*60*60);  
  4. userCookie.setPath("/web2/");  
  5. response.addCookie(userCookie);  
  6. %> 

web1下的getcookie.jsp(SUN企业级应用的***)

  1. <%  
  2. Cookie[] cookie = request.getCookies();  
  3. String user = new String();  
  4. if ( cookie != null ) {  
  5. for (int i = 0; i < cookie.length; i++) {  
  6. Cookie myCookie = cookie[i];  
  7. if (myCookie.getName().equals("user")) {  
  8. user = myCookie.getValue();  
  9. }  
  10. }  
  11. }  
  12. out.println("user = " + user);  
  13. %>  
  14. web2下的getcookie.jsp(SUN企业级应用的***)  
  15. <%  
  16. Cookie[] cookie = request.getCookies();  
  17. String user = new String();  
  18. if ( cookie != null ) {  
  19. for (int i = 0; i < cookie.length; i++) {  
  20. Cookie myCookie = cookie[i];  
  21. if (myCookie.getName().equals("user")) {  
  22. user = myCookie.getValue();  
  23. }  
  24. }  
  25. }  
  26. out.println("user = " + user);  
  27. %> 

先访问web1下的setcookie.jsp(SUN企业级应用的***),然后分别访问web1和web2下面的getcookie.jsp(SUN企业级应用的***)文件,你会发现奇怪的现象,web1下的getcookie.jsp(SUN企业级应用的***)中user为空而web2下的getcookie.jsp(SUN企业级应用的***)中user却有值,这就实现了从一个web应用下设置的cookie在另一个web应用下获得。

大多数人删除cookie不成功都是因为目录原因。一个典型的原因是在某一个目录中设置了cookie(没有调用setPath方法)却在另一个目录中删除该cookie(其实是调用setMaxAge方法)

3、跨域共享cookie的方法:设置

  1. cookie.setDomain(".jszx.com"); 

A机所在的域:home.langchao.com,A有应用cas

B机所在的域:jszx.com,B有应用webapp_b

1)在cas下面设置cookie的时候,增加cookie.setDomain(".jszx.com");,这样在webapp_b下面就可以取到cookie。

2)这个参数必须以“.”开始。

3)输入url访问webapp_b的时候,必须输入域名才能解析。比如说在A机器输入:http://lc-bsp.jszx.com:8080/webapp_b,可以获取cas在客户端设置的cookie,而B机器访问本机的应用,输入:http://localhost:8080/webapp_b则不可以获得cookie。

4)设置了cookie.setDomain(".jszx.com");,还可以在默认的home.langchao.com下面共享。

二、读取

从客户端读取Cookie时调用的是HttpServletRequest的getCookies方法。该方法返回一个与HTTP请求头中的内容对应的Cookie对象数组。得到这个数组之后,一般是用循环访问其中的各个元素,调用getName检查各个Cookie的名字,直至找到目标Cookie。然后对这个目标Cookie调用getValue,根据获得的结果进行其他处理。

注意:若jsp(SUN企业级应用的***)和Servlet所在目录(Servlet为其映射目录)的父目录中有同名cookie,则request.getCookie()方法得到的Cookie数组中保存的是其父目录中的cookie的信息;

三、说明

我们知道,对于一个页面中的request和response,是一次http请求产生的,request是http请求中的所有参数,因此包含了发出这次http请求时cookie的值,而response是对于这次http请求webapplication产生的反应,所以它可以写cookie的值,这样看来,request得到的cookie的值,和response要写的cookie的值可以说是完全不同的。

简单地说request得到的cookie的值是在这次http请求之前的cookie的值,而response要写得值是这次http请求之后的cookie的值。所以,在同一个request和response中,如果response中增加了新的cookie,request中并不能得到。

【编辑推荐】

  1. jsp开发技术应用的29个注意事项
  2. JSP虚拟主机使用中的乱码问题
  3. jsp速度优化七种方法
  4. 详细了解JSP中九个隐含对象
  5. 详细介绍JSP技术的两种架构模型
责任编辑:于铁 来源: 互联网
相关推荐

2011-07-08 11:19:51

jspaction

2009-07-01 10:12:40

JSP环境配置JSP引擎

2009-09-02 09:44:01

JSP和JavaBea

2009-07-03 18:31:04

JSP表达式

2009-07-03 11:21:43

Servlet和JSPJSP路径

2011-06-07 11:14:51

JAVAJSP

2011-06-21 14:25:44

JavaScriptcookie

2011-06-15 13:07:10

JSP和JavaBea

2011-07-13 15:47:18

MFC

2011-07-21 15:44:33

Java内部类

2011-07-11 15:02:54

枚举

2009-06-17 16:01:28

2011-06-08 16:05:34

VB数组

2011-07-20 15:58:53

C++引用

2011-07-11 11:02:12

JAVA集合框架

2011-06-08 15:45:41

字符串JAVA

2010-03-18 15:47:07

Java创建线程

2009-07-06 15:31:42

JSP Action

2010-03-10 19:25:04

python多线程

2011-07-14 11:08:30

C#继承
点赞
收藏

51CTO技术栈公众号