1. public class Cookie implements Cloneable {
  2. private static final String LSTRING_FILE =
  3. "javax.servlet.http.LocalStrings";
  4. private static ResourceBundle lStrings =
  5. ResourceBundle.getBundle(LSTRING_FILE);
  6. //cookie本身的值
  7. private String name;    // NAME= ... "$Name" style is reserved
  8. private String value;   // value of NAME
  9. //cookie的头部信息
  10. private String comment; // ;Comment=VALUE ... describes cookie's use
  11. // ;Discard ... implied by maxAge < 0
  12. private String domain;  // ;Domain=VALUE ... domain that sees cookie
  13. private int maxAge = -1;    // ;Max-Age=VALUE ... cookies auto-expire
  14. private String path;    // ;Path=VALUE ... URLs that see the cookie
  15. private boolean secure; // ;Secure ... e.g. use SSL
  16. private int version = 0;    // ;Version=1 ... means RFC 2109++ style
  17. /**
  18. * Constructs a cookie with a specified name and value.
  19. *
  20. * @param name          a <code>String</code> specifying the name of the cookie
  21. *
  22. * @param value         a <code>String</code> specifying the value of the cookie
  23. *
  24. * @throws IllegalArgumentException if the cookie name contains illegal characters
  25. *                  (for example, a comma, space, or semicolon)
  26. *                  or it is one of the tokens reserved for use
  27. *                  by the cookie protocol
  28. * @see #setValue
  29. * @see #setVersion
  30. *
  31. */
  32. //构造函数,指定特定的name和value
  33. public Cookie(String name, String value) {
  34. if (!isToken(name)
  35. || name.equalsIgnoreCase("Comment") // rfc2019
  36. || name.equalsIgnoreCase("Discard") // 2019++
  37. || name.equalsIgnoreCase("Domain")
  38. || name.equalsIgnoreCase("Expires") // (old cookies)
  39. || name.equalsIgnoreCase("Max-Age") // rfc2019
  40. || name.equalsIgnoreCase("Path")
  41. || name.equalsIgnoreCase("Secure")
  42. || name.equalsIgnoreCase("Version")
  43. || name.startsWith("$")
  44. ) {
  45. String errMsg = lStrings.getString("err.cookie_name_is_token");
  46. Object[] errArgs = new Object[1];
  47. errArgs[0] = name;
  48. errMsg = MessageFormat.format(errMsg, errArgs);
  49. throw new IllegalArgumentException(errMsg);
  50. }
  51. this.name = name;
  52. this.value = value;
  53. }
  54. /**
  55. *
  56. * Specifies a comment that describes a cookie's purpose.
  57. * The comment is useful if the browser presents the cookie
  58. * to the user. Comments
  59. * are not supported by Netscape Version 0 cookies.
  60. *
  61. * @param purpose       a <code>String</code> specifying the comment
  62. *              to display to the user
  63. *
  64. * @see #getComment
  65. *
  66. */
  67. //cookie的说明
  68. public void setComment(String purpose) {
  69. comment = purpose;
  70. }
  71. //返回cookie数目,为空返回null
  72. public String getComment() {
  73. return comment;
  74. }
  75. /**
  76. * Specifies the domain within which this cookie should be presented.
  77. * <p>The form of the domain name is specified by RFC 2109. A domain
  78. * name begins with a dot (<code>.foo.com</code>) and means that
  79. * the cookie is visible to servers in a specified Domain Name System
  80. * (DNS) zone (for example, <code>www.foo.com</code>, but not
  81. * <code>a.b.foo.com</code>). By default, cookies are only returned
  82. * to the server that sent them.
  83. * @param pattern       a <code>String</code> containing the domain name
  84. *              within which this cookie is visible;
  85. *              form is according to RFC 2109
  86. *
  87. * @see #getDomain
  88. */
  89. //给cookie设置在某个domain中有效
  90. public void setDomain(String pattern) {
  91. domain = pattern.toLowerCase(); // IE allegedly needs this
  92. }
  93. //获得作用域
  94. public String getDomain() {
  95. return domain;
  96. }
  97. /**
  98. * Sets the maximum age of the cookie in seconds. <p>A positive value indicates that the cookie will expire after that many seconds have passed. Note that the value is
  99. the <i>maximum</i> age when the cookie will expire, not the cookie's current age.
  100. * <p>A negative value means
  101. * that the cookie is not stored persistently and will be deleted
  102. * when the Web browser exits. A zero value causes the cookie
  103. * to be deleted.
  104. * @param expiry        an integer specifying the maximum age of the cookie in seconds; if negative, means the cookie is not stored; if zero, deletes
  105. *  the cookie
  106. * @see #getMaxAge
  107. */
  108. //cookie的生存时间
  109. public void setMaxAge(int expiry) {
  110. maxAge = expiry;
  111. }
  112. //获得最大生存时间
  113. public int getMaxAge() {
  114. return maxAge;
  115. }
  116. //客户端返回的cookie在某个路径
  117. public void setPath(String uri) {
  118. path = uri;
  119. }
  120. //返回客户端返回的cookie在server上的地址
  121. public String getPath() {
  122. return path;
  123. }
  124. /**
  125. * Indicates to the browser whether the cookie should only be sent
  126. * using a secure protocol, such as HTTPS or SSL.
  127. * <p>The default value is <code>false</code>.
  128. * @param flag  if <code>true</code>, sends the cookie from the browser
  129. *          to the server only when using a secure protocol;
  130. *          if <code>false</code>, sent on any protocol
  131. * @see #getSecure
  132. */
  133. public void setSecure(boolean flag) {
  134. secure = flag;
  135. }
  136. public boolean getSecure() {
  137. return secure;
  138. }
  139. //返回cookie的name,一旦创建name不可变
  140. public String getName() {
  141. return name;
  142. }
  143. //给cookie赋值
  144. public void setValue(String newValue) {
  145. value = newValue;
  146. }
  147. //获得cookie的值
  148. public String getValue() {
  149. return value;
  150. }
  151. //返回cookie依从的协议版本
  152. public int getVersion() {
  153. return version;
  154. }
  155. //设置版本
  156. public void setVersion(int v) {
  157. version = v;
  158. }
  159. // Note -- disabled for now to allow full Netscape compatibility
  160. // from RFC 2068, token special case characters
  161. //
  162. // private static final String tspecials = "()<>@,;:\\\"/[]?={} \t";
  163. private static final String tspecials = ",; ";
  164. /*
  165. * Tests a string and returns true if the string counts as a
  166. * reserved token in the Java language.
  167. *
  168. * @param value     the <code>String</code> to be tested
  169. *
  170. * @return          <code>true</code> if the <code>String</code> is
  171. *              a reserved token; <code>false</code>
  172. *              if it is not
  173. */
  174. private boolean isToken(String value) {
  175. int len = value.length();
  176. for (int i = 0; i < len; i++) {
  177. char c = value.charAt(i);
  178. if (c < 0x20 || c >= 0x7f || tspecials.indexOf(c) != -1)
  179. return false;
  180. }
  181. return true;
  182. }
  183. //复制cookie
  184. public Object clone() {
  185. try {
  186. return super.clone();
  187. } catch (CloneNotSupportedException e) {
  188. throw new RuntimeException(e.getMessage());
  189. }
  190. }
  191. }
</pre><pre>

												

Java-Cookie源码的更多相关文章

  1. Java集合源码分析(四)Vector<E>

    Vector<E>简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是 ...

  2. Java集合源码分析(三)LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...

  3. Java集合源码分析(二)ArrayList

    ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...

  4. Java集合源码学习(一)集合框架概览

    >>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...

  5. 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码

    转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...

  6. 【转】Java HashMap 源码解析(好文章)

    ­ .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...

  7. Java Reference 源码分析

    @(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...

  8. Eclipse Java 关联源码

    今天打代码的时候打算看看Java的源码是怎么实现的 没想到还没关联源码 遇到上面的情况只需要关联下源码就可以对着方法按F3查看JAVA的开源代码. 解决上面如下: 找到jdk的安装目录 找到src.z ...

  9. 自学Java HashMap源码

    自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...

  10. Java集合类源码解析:Vector

    [学习笔记]转载 Java集合类源码解析:Vector   引言 之前的文章我们学习了一个集合类 ArrayList,今天讲它的一个兄弟 Vector.为什么说是它兄弟呢?因为从容器的构造来说,Vec ...

随机推荐

  1. Activtiy完全解析(二、layout的inflate过程)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52457893 本文出自:[openXu的博客]   在上一篇文章<Activtiy完全 ...

  2. [OpenCV] Write & Read files

    例如写 KeyPoint向量,以及他的描述矩阵. // ... vector<KeyPoint> key_points; Mat descriptors; // ... fs.open(o ...

  3. SceneKit一个3D场景角色的代码重构

    SuperSpaceMan3D是一个以SceneKit为基础的小游戏项目,作者展示了用SceneKit开发3D游戏的强大威力.不过在实际运行时会发现有一些小bug,这里我们依次尝试将其修复 首先,当s ...

  4. 两种利用GCD实现分步获取结果的方式和SDWebImage缓存机制的验证

    前段时间写界面,因为数据的请求分成了两部分,所以用到了多线程,实现数据的分步请求,然后自己写了一个Demo,用两种方式实现分步获取内容,其中也包含了验证SDWebImage这个库的缓存机制,在这里给大 ...

  5. VisualStudio2010配置OpenCV的一种一劳永逸的方法

    用VS使用OpenCV的时候,又不想全局配置,每次都要配置简直烦死了. 鉴于此,给大家介绍一种简便一点的方法. 配置环境的前提是:成功安装了OpenCV合适的版本. 我这里用的是OpenCV2.4.9 ...

  6. Android Studio 使用wifi调试插件

    由于手机亦或是数据线的问题,在应用开发过程中会时不时地遇到手机突然连不上电脑的尴尬时刻,于是就学习了如何使用wifi进行应用调试.下面就具体介绍一下adb wifi插件的安装和使用.其实我们只需要安装 ...

  7. 对LCS算法及其变种的初步研究

    LCS的全称为Longest Common Subsequence,用于查找两个字符串中的最大公共子序列,这里需要注意区分子序列与子串,所谓子序列,指的是从前到后,可以跳跃元素筛选,而字串则必须连续筛 ...

  8. Android开发学习之路--UI之初体验

    之前都是学习Activity,对于布局都没有做过学习,这里就简单学习下吧.下面看下Android Studio下有哪些控件: 这里分为Widgets,Text Fields,Containers,Da ...

  9. python上下文管理器ContextLib及with语句

    http://blog.csdn.net/pipisorry/article/details/50444736 with语句 with语句是从 Python 2.5 开始引入的一种与异常处理相关的功能 ...

  10. gradle 修改生成的apk的名字

    在app的module里的build.gradle文件中,在android { ...}里面加上这样一段代码,即可修改生成的apk的文件名. android.applicationVariants.a ...