`
cfan_haifeng
  • 浏览: 122375 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

javaee-cookie响应,请求小解

阅读更多

1.cookie是首先由服务器向浏览器发送的

 

  cookie最早来源于服务器,它像浏览器发送的响应头,如下:

 

 

HTTP/1.1 200
Server:...
Set-Cookie: name=admin
Set-Cookie: nickname=nick_admin; 
Set-Cookie: email="test1@it315.org";
Set-Cookie: phone=1111111
……

 

每一个Cookie信息都用一个Set-Cookie头传送。实现如上效果的servlet代码如下:

 

 

Cookie ckName = new Cookie("name", name);
			Cookie ckNickname = new Cookie("nickname", nickname);
			ckNickname.setMaxAge(365 * 24 * 3600);
			Cookie ckEmail = new Cookie("email", "test1@it315.org");
			Cookie ckPhone = new Cookie("phone", "1111111");
			//奇怪,针对chrome就不生成JSESSIONID
			response.addCookie(ckName);
			response.addCookie(ckNickname);
			response.addCookie(ckEmail);
			response.addCookie(ckPhone);
 

 

 

2.浏览器返回cookie信息

 

    浏览器在收到服务器发送的cookie时,存储起来,并在每次向服务器请求时重新将cookie信息返回。如下:

 

 
POSE /** HTTP/1.1

accept : image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
accept-language : zh-cn
user-agent : Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727)
accept-encoding : gzip, deflate
host : localhost:8080
connection : Keep-Alive
Cookie: name=admin; nickname=nick_admin; email="test1@it315.org"; phone=1111111; JSESSIONID=CDF550D953DAB0E59A57D7D1CCFDDD30
 

 

 

3. http请求、发送小结

 

   通过这样一来一回,返回的cookie信息是一致的(你可以改),就可以判断唯一用户了。这种方式也可以用来实现session。

 

   读取http请求中的cookie方法如下:

 

 

String lastNickname = null;
			Cookie[] cks = request.getCookies();
			for (int i = 0; cks != null && i < cks.length; i++) {
				if ("nickname".equals(cks[i].getName())) {
					lastNickname = cks[i].getValue();
					break;
				}
			}

 

 

   或者也可以这么取

 

 

String cookieHeader = request.getHeader("Cookie");
 

 

   可以通过:http://localhost:8080/Test_servlet/ch7/CookieServlet1?name=admin&nickname=nick_admin

查看效果。

 

 

3.Cookie源代码

 

 

    Cookie类,真是难得一见的类,不是接口。

 

package javax.servlet.http;

import java.text.MessageFormat;
import java.util.ResourceBundle;

public class Cookie
  implements Cloneable
{
  private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
  private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");
  private String name;
  private String value;
  private String comment;
  private String domain;
  private int maxAge = -1;
  private String path;
  private boolean secure;
  private int version = 0;
  private static final String tspecials = ",; ";

  public Cookie(String name, String value)
  {
    if ((!(isToken(name))) || (name.equalsIgnoreCase("Comment")) || (name.equalsIgnoreCase("Discard")) || (name.equalsIgnoreCase("Domain")) || (name.equalsIgnoreCase("Expires")) || (name.equalsIgnoreCase("Max-Age")) || (name.equalsIgnoreCase("Path")) || (name.equalsIgnoreCase("Secure")) || (name.equalsIgnoreCase("Version")) || (name.startsWith("$")))
    {
      String errMsg = lStrings.getString("err.cookie_name_is_token");
      Object[] errArgs = new Object[1];
      errArgs[0] = name;
      errMsg = MessageFormat.format(errMsg, errArgs);
      throw new IllegalArgumentException(errMsg);
    }

    this.name = name;
    this.value = value;
  }

  public void setComment(String purpose)
  {
    this.comment = purpose;
  }

  public String getComment()
  {
    return this.comment;
  }

  public void setDomain(String pattern)
  {
    this.domain = pattern.toLowerCase();
  }

  public String getDomain()
  {
    return this.domain;
  }

  public void setMaxAge(int expiry)
  {
    this.maxAge = expiry;
  }

  public int getMaxAge()
  {
    return this.maxAge;
  }

  public void setPath(String uri)
  {
    this.path = uri;
  }

  public String getPath()
  {
    return this.path;
  }

  public void setSecure(boolean flag)
  {
    this.secure = flag;
  }

  public boolean getSecure()
  {
    return this.secure;
  }

  public String getName()
  {
    return this.name;
  }

  public void setValue(String newValue)
  {
    this.value = newValue;
  }

  public String getValue()
  {
    return this.value;
  }

  public int getVersion()
  {
    return this.version;
  }

  public void setVersion(int v)
  {
    this.version = v;
  }

  private boolean isToken(String value)
  {
    int len = value.length();

    for (int i = 0; i < len; ++i) {
      char c = value.charAt(i);

      if ((c < ' ') || (c >= '') || (",; ".indexOf(c) != -1))
        return false;
    }
    return true;
  }

  public Object clone()
  {
    try
    {
      return super.clone();
    } catch (CloneNotSupportedException e) {
      throw new RuntimeException(e.getMessage());
    }
  }
}

 

参考:《深入体验Java_Web开发内幕-核心基础\》

 

……

……

 

 

 

 

分享到:
评论

相关推荐

    javaee-api-8.0-javadoc.jar

    javaee-api-8.0-javadoc.jar,这是javaee1.8api的jar包,解压后可用javadoc2chm制作成chm帮助文档。

    javaee-api-7.0.jar

    javaweb/javaEE常用jar包,亲测可用,导入到java工程中使用

    javaee-api-7.0-javadoc.jar 中文版,使用谷歌翻译,导入idea后可以提示中文

    javaee-api-7.0-javadoc.jar 中文版,使用谷歌翻译,导入idea后可以提示中文

    javaee-api-5.jar

    javaee-api-5.jar 如果帮到你了,在评论里美言几句吧

    javaee-api-6.0-5

    java javaee-api-6.0-5

    netbeans-7.1.2-ml-javaee-windows.part2

    netbeans-7.1.2-ml-javaee-windows.part2

    javaee-api-6.0.jar

    javaee-api-6.0.jar.....................

    javaee-api-5.1.2.jar

    `javaee-api-5-license.txt`文件很可能包含了该库的许可协议信息,对于开源软件,了解这些许可条款非常重要,因为它们定义了用户可以如何使用、修改和分发代码。 总的来说,`javaee-api-5.1.2.jar`是JavaEE开发的...

    javaee-endorsed-api-7.0.jar

    java运行依赖jar包

    javaee-api-7.0.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 ...

    javaee-api-7.0-sources.jar

    javaee-api-7.0.jar的.Java文件,分享给想看源码的同学。同事该包能解决myeclipse中的"the source attachment does not contain the source for the file xxx.class"问题

    javaee-api-7.0.jar包免费版

    javaee-api-7.0.jar包免费版是一款在java开发中十分重要的jar包,如果您的java架包内缺少了这款javaee api 7.0.jar将会导致您的开发十分的不流畅,马上下载javaee api 7.0.jar包使用吧。 基本简介  jar包就是别人...

    eclipse-Mars-for-javaEE-win64-2015.10.9

    从eclipse官网下的,用来在javaEE开发,集成了许多web开发的插件. win7 64位上亲测可,我的 JDK是1.8.0版64位的, java 版本:1.8.0,64位 eclipse-Mars-for-javaEE-2015.10.9-win64

    javaee-api-8.0-javadoc.zip

    这个压缩包文件“javaee-api-8.0-javadoc.zip”包含的是JavaEE 8.0的API文档,它以Javadoc的形式提供,这是一种标准的工具,用于从Java源代码中提取注释,生成格式化的、详细的技术文档。 Javadoc是Sun ...

    javaee-web相关api

    在"javaee-web相关api"这个主题下,我们将探讨其中的一些关键知识点。 1. **JDK 6.0 API 中文版**: JDK(Java Development Kit)是Java编程的基础,包含了编译器、调试器、JVM(Java Virtual Machine)以及标准API...

    JavaEE-Turorial-源码

    JavaEE-Turorial-源码 是一套专门为学习Java企业级应用开发提供的教程源代码,它与《JavaEE-Turorial-教材》配套使用,旨在帮助开发者深入理解JavaEE平台的各种技术,并通过实际操作来提升技能。JavaEE(Java ...

    javaee_api.zip_JavaEE_Javaee的api_Javax.javaee-api_javaee api 文档_

    1. **Servlet**:Servlet是JavaEE中的核心组件之一,用于处理HTTP请求和响应。它扩展了Web服务器的功能,使得服务器能够处理动态内容。Servlet API定义了Servlet类和ServletConfig接口,以及Servlet生命周期相关的...

    javaee-API

    本压缩包中的"javaee-API"显然关注了三个关键部分:Hibernate-API、jsp-API和servlet-API,这些都是JavaEE体系中的重要组件。 **Hibernate-API**: Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者...

Global site tag (gtag.js) - Google Analytics