关于cookie路径问题

转自:http://www.blogjava.net/freiberg/archive/2007/09/17/145799.html
这个问题今天也搞得我很郁闷,写入cookie时因为我写入时是在下级路径写入的,读取是要在上级路径读取,可是来来回回就是不行,死活在上级路径读取不了,在网上搜了很多文章,最后终于解决了, 最后转前辈写的一篇关于cookie的文章。
/************************************************************/
一、设置  
  Cookie是通过HttpServletResponse的addCookie方法加入到Set-Cookie应答头中的  
  例如:  
          Cookie   userCookie   =   new   Cookie("user",   "admin");    
          response.addCookie(userCookie);  
  和设置有关系的还有以下两个重要方法  
  1.setMaxAge  
  设置Cookie过期之前的时间,以秒计。如果不设置该值,则Cookie只在当前会话内有效,而且这些Cookie不会保存到磁盘上。  
  注意:删除cookie就是通过该方法实现的。将要删除的cookie的过期之前的时间指定为0就可以达到删除该cookie的目的。  
  2.setPath  
  设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面(JSP页面或者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和getcookie.jsp、在web2下有getcookie.jsp  
  web1下的setcookie.jsp  
  <%  
          Cookie   userCookie   =   new   Cookie("user",   "admin");    
          userCookie.setMaxAge(24*60*60);  
          userCookie.setPath("/web2/");  
          response.addCookie(userCookie);  
  %>  
  web1下的getcookie.jsp  
  <%  
          Cookie[]   cookie   =   request.getCookies();  
          String   user   =   new   String();  
          if   (   cookie   !=   null   )   {  
                  for   (int   i   =   0;   i   <   cookie.length;   i++)   {  
                          Cookie   myCookie   =   cookie[i];  
                          if   (myCookie.getName().equals("user"))   {  
                                  user   =   myCookie.getValue();  
                          }  
                  }  
          }  
  out.println("user   =   "   +   user);  
  %>  
  web2下的getcookie.jsp  
  <%  
          Cookie[]   cookie   =   request.getCookies();  
          String   user   =   new   String();  
          if   (   cookie   !=   null   )   {  
                  for   (int   i   =   0;   i   <   cookie.length;   i++)   {  
                          Cookie   myCookie   =   cookie[i];  
                          if   (myCookie.getName().equals("user"))   {  
                                  user   =   myCookie.getValue();  
                          }  
                  }  
          }  
  out.println("user   =   "   +   user);  
  %>  
  先访问web1下的setcookie.jsp,然后分别访问web1和web2下面的getcookie.jsp文件,你会发现奇怪的现象,web1下的getcookie.jsp中user为空而web2下的getcookie.jsp中user却有值,这就实现了从一个web应用下设置的cookie在另一个web应用下获得。  
  大多数人删除cookie不成功都是因为目录原因。一个典型的原因是在某一个目录中设置了cookie(没有调用setPath方法)却在另一个目录中删除该cookie(其实是调用setMaxAge方法)  
   
  二、读取  
  从客户端读取Cookie时调用的是HttpServletRequest的getCookies方法。该方法返回一个与HTTP请求头中的内容对应的Cookie对象数组。得到这个数组之后,一般是用循环访问其中的各个元素,调用getName检查各个Cookie的名字,直至找到目标Cookie。然后对这个目标Cookie调用getValue,根据获得的结果进行其他处理。  
  注意:若JSP和Servlet所在目录(Servlet为其映射目录)的父目录中有同名cookie,则request.getCookie()方法得到的Cookie数组中保存的是其父目录中的cookie的信息;一、设置  
  Cookie是通过HttpServletResponse的addCookie方法加入到Set-Cookie应答头中的  
  例如:  
          Cookie   userCookie   =   new   Cookie("user",   "admin");    
          response.addCookie(userCookie);  
  和设置有关系的还有以下两个重要方法  
  1.setMaxAge  
  设置Cookie过期之前的时间,以秒计。如果不设置该值,则Cookie只在当前会话内有效,而且这些Cookie不会保存到磁盘上。  
  注意:删除cookie就是通过该方法实现的。将要删除的cookie的过期之前的时间指定为0就可以达到删除该cookie的目的。  
  2.setPath  
  设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面(JSP页面或者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和getcookie.jsp、在web2下有getcookie.jsp  
  web1下的setcookie.jsp  
  <%  
          Cookie   userCookie   =   new   Cookie("user",   "admin");    
          userCookie.setMaxAge(24*60*60);  
          userCookie.setPath("/web2/");  
          response.addCookie(userCookie);  
  %>  
  web1下的getcookie.jsp  
  <%  
          Cookie[]   cookie   =   request.getCookies();  
          String   user   =   new   String();  
          if   (   cookie   !=   null   )   {  
                  for   (int   i   =   0;   i   <   cookie.length;   i++)   {  
                          Cookie   myCookie   =   cookie[i];  
                          if   (myCookie.getName().equals("user"))   {  
                                  user   =   myCookie.getValue();  
                          }  
                  }  
          }  
  out.println("user   =   "   +   user);  
  %>  
  web2下的getcookie.jsp  
  <%  
          Cookie[]   cookie   =   request.getCookies();  
          String   user   =   new   String();  
          if   (   cookie   !=   null   )   {  
                  for   (int   i   =   0;   i   <   cookie.length;   i++)   {  
                          Cookie   myCookie   =   cookie[i];  
                          if   (myCookie.getName().equals("user"))   {  
                                  user   =   myCookie.getValue();  
                          }  
                  }  
          }  
  out.println("user   =   "   +   user);  
  %>  
  先访问web1下的setcookie.jsp,然后分别访问web1和web2下面的getcookie.jsp文件,你会发现奇怪的现象,web1下的getcookie.jsp中user为空而web2下的getcookie.jsp中user却有值,这就实现了从一个web应用下设置的cookie在另一个web应用下获得。  
  大多数人删除cookie不成功都是因为目录原因。一个典型的原因是在某一个目录中设置了cookie(没有调用setPath方法)却在另一个目录中删除该cookie(其实是调用setMaxAge方法)  
   
  二、读取  
  从客户端读取Cookie时调用的是HttpServletRequest的getCookies方法。该方法返回一个与HTTP请求头中的内容对应的Cookie对象数组。得到这个数组之后,一般是用循环访问其中的各个元素,调用getName检查各个Cookie的名字,直至找到目标Cookie。然后对这个目标Cookie调用getValue,根据获得的结果进行其他处理。  
  注意:若JSP和Servlet所在目录(Servlet为其映射目录)的父目录中有同名cookie,则request.getCookie()方法得到的Cookie数组中保存的是其父目录中的cookie的信息;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值