Servlet操作Cookie说明

本文详细介绍了如何解决访问不同端口号(如8080和127.0.0.1:8080)时,导致客户端浏览器存储的Cookie位置不一致的问题。通过调整Cookie的域名属性或使用特定的访问方式,确保Cookie统一存储在服务器自定义的域名下,避免因端口号变化而导致的Cookie获取失败问题。

用到的类 javax.servlet.http.Cookie

构造cookie 的方法 :  new Cookie(键,值)
构造函数如下:
Cookie(java.lang.String name, java.lang.String value)


把cookie发送给客户端
HttpServletResponse.addCookie(javax.servlet.http.Cookie)


取得客户浏览器的cookie,返回的是数组
HttpServletRequest.getCookies()


getComment/setComment 

      获取/设置Cookie的注释。


getDomain/setDomain
  获取/设置Cookie适用的域。一般地,Cookie只返回给与发送它的服务器名字完全相同的服务器。使用这里的方法可以指示浏览器把Cookie返回给同一域内的其他服务器。注意域必须以点开始(例如.sitename.com),非国家类的域(如.com,.edu,.gov)必须包含两个点,国家类的域(如.com.cn,.edu.uk)必须包含三个点。


getMaxAge/setMaxAge
  获取/设置Cookie过期之前的时间,以秒计。如果不设置该值,则Cookie只在当前会话内有效,即在用户关闭浏览器之前有效,而且这些Cookie不会保存到磁盘上。

若生存时间为负值,代表浏览器关闭Cookie即消失。生存时间为0,代表删除Cookie,生存时间为正数,代表Cookie存在多少秒。


getName/setName
  获取/设置Cookie的名字。本质上,名字和值是我们始终关心的两个部分。由于HttpServletRequest的getCookies方法返回的是一个Cookie对象的数组,因此通常要用循环来访问这个数组查找特定名字,然后用getValue检查它的值。


getPath/setPath
  获取/设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下的所有页面。这里的方法可以用来设定一些更一般的条件。例如,someCookie.setPath("/"),此时服务器上的所有页面都可以接收到该Cookie。


getSecure/setSecure
  获取/设置一个boolean值,该值表示是否Cookie只能通过加密的连接(即SSL)发送。


getValue/setValue
  获取/设置Cookie的值。如前所述,名字和值实际上是我们始终关心的两个方面。不过也有一些例外情况,比如把名字作为逻辑标记(也就是说,如果名字存在,则表示true)。


getVersion/setVersion
  获取/设置Cookie所遵从的协议版本。默认版本0(遵从原先的Netscape规范);版本1遵从RFC 2109 , 但尚未得到广泛的支持。

几个Cookie工具函数,获取指定名字的Cookie值
   该函数是ServletUtilities.java的一部分。getCookieValue通过循环依次访问Cookie对象数组的各个元素,寻找是否有指定名字的Cookie,如找到,则返回该Cookie的值;否则,返回参数中给出的默认值。getCookieValue能够在一定程度上简化Cookie值的提取。



cookie保存在哪里
在Windows 9X系统计算机中,Cookie文件的存放位置为C:\Windows\Cookies,在Windows NT/2000/ XP的计算机中,Cookie文件的存放位置为C:\Documents and Settings\用户名\Cookie文件夹。

--------------------------------

 

下面是代码,是直接从项目中实际代码

Java代码   收藏代码
  1. /** 
  2.  * 设置SSO认证标识(把用户名,密码 写入客户端浏览器的cookie),关闭浏览器后,cookie立即失效 
  3.  *  
  4.  * @param response 
  5.  *            HttpServletResponse 
  6.  * @param userName 
  7.  *            用户名 
  8.  * @param password 
  9.  *            密码 
  10.  */  
  11. public static void setReffer(final HttpServletResponse response, final String userName, final String password)  
  12. {  
  13.     final String sSession = password + userName;  //密码是SHA1加密,长度为40个字符(160位)  
  14.     Cookie oItem;  
  15.     // 因为Cookie 中不允许保存特殊字符, 所以采用 BASE64 编码,CookieUtil.encode()是BASE64编码方法,略..  
  16.     oItem = new Cookie("SSO", CookieUtil.encode(sSession));  
  17.     oItem.setDomain(.google.com);  //请用自己的域  
  18.     oItem.setMaxAge(-1); //关闭浏览器后,cookie立即失效          
  19.     oItem.setPath("/");  
  20.     response.addCookie(oItem);  
  21. }  

 

Java代码   收藏代码
  1. /** 
  2.  * 认证SSO标识(从客户端浏览器读入cookie, 并取得用户名、密码,不能取得时返回null) 
  3.  *  
  4.  * @param request 
  5.  * @return 返回从cookie中取得的用户名、密码,不能取得时返回null.String[0]中保存用户名,String[1]中保存密码 
  6.  */  
  7. public static String[] checkReffer(final HttpServletRequest request)  
  8. {  
  9.     final Cookie[] oCookies = request.getCookies();  
  10.     if (oCookies != null)  
  11.     {  
  12.         for (final Cookie oItem : oCookies)  
  13.         {  
  14.             final String sName = oItem.getName();  
  15.   
  16.             if (sName.equals("SSO"))  
  17.             {  
  18.                 final String sSession = CookieUtil.decode(oItem.getValue()); //解码 CookieUtil.decode()是BASE64解码方法,略..  
  19.                 if (sSession.length() > 40)  
  20.                 {  
  21.                     // 获得存储在 Cookies 中的用户名称和密码  
  22.                     final String sUser = sSession.substring(40);  
  23.                     final String sPass = sSession.substring(040);  
  24.                     final String[] strArr =  
  25.                     { sUser, sPass };  
  26.                     return strArr; //返回用户名,密码  
  27.                 }  
  28.             }  
  29.         }  
  30.     }  
  31.     return null;  
  32. }  





今天测试设置和获取Cookie遇到了一点小问题,很奇怪的问题;

  把J2ee服务部署在本地 8080端口;访问任何一个服务时,如果客户端没有cookie,则下发cookie,

  如果客户端已经有了该cookie的值就不下发,代码逻辑如下:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String uid="";
Cookie mycookies[] = request.getCookies();
 if (mycookies!= null) {
            for (int i = 0; i <  mycookies.length ; i++) {
                if ("uid".equalsIgnoreCase(mycookies[i].getName())) {
                     uid = mycookies [i].getValue();
                }
             }
        }
     if(!StringUtils.isNull(uid)){
      //do nothing
  }else{
  String  host = request .getHeader("host");
  uid = UUID .create();
 Cookie   mycookie  =  new  Cookie("uid",uid);
 mycookie.setDomain(host);
 mycookie.setMaxAge(93312000);//三年
 response.addCookie(mycookie);
}
System.out.println("uid is>"+uid);

  1、访问:

  http://localhost:8080/

  以及内部的页面,打印uid的值是相同的;符合要求

  2、访问:

  http://127.0.0.1:8080

  以及内部的页面, uid每次都获取得值都是不同的;

  两者的区别仅仅的访问的方式不同,如果用ip访问

  Cookie mycookies[] = request.getCookies();中永远获取不到uid的值;

  (80端口号除外)

  查了浏览器的具体cookie值,发现

  http://localhost:8080/ 访问的时候,cookie值放在localhost下,服务器自动生成的SESSIONID也是存放在localhost路径下。

  http://127.0.0.1:8080/ 访问的时候,cookie uid值放在127.0.0.1:8080下,在127.0.0.1:8080下的cookie服务端的Servlet永远都获取不到;而服务器自动生成的SESSIONID则是在127.0.0.1下,与uid存放位置不同。

  所以在服务端下发cookie的时候,

  String host=request.getHeader("host");

  需要修改为

双击代码全选
1
2
3
if(host.indexOf(":")>-1){
      host=host.split(":")[0];
     }

  或者放弃设置mycookie.setDomain(host);

  这样cookie值也是保存在127.0.0.1下的,与端口号不关联

  当然是服务器已经有域名的就不会出现端口号下获取不到cookie的值;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值