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. how to output quotes in bash prompt

    introduction In certain situations, quotes are required to be output in the command prompt. To do th ...

  2. 深入了解UIViewController控制器与对应的View类的详解

    ViewController是iOS开发中MVC模式中的C(视图控制器),ViewController是view的controller,ViewController的职责主要包括管理内部各个view的 ...

  3. FFmpeg的HEVC解码器源代码简单分析:概述

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

  4. Erlang标准数据结构的选择

    Erlang标准数据结构的选择(金庆的专栏)gen_server with a dict vs mnesia table vs etshttp://stackoverflow.com/question ...

  5. sublime text3空格和tab的显示

    最近在使用sublime text3修改shell文件时,明明看着相同的文件,对比却说不一样.最后发现是空格和tab惹的祸. 1.显示空格和tab: 在Preferences→Key Bindings ...

  6. Android系统剪切板

    Android系统剪贴板 复制字符串到系统剪切板 /** * 复制文本到剪切板 * * @param text * @return */ @SuppressWarnings("depreca ...

  7. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  8. 使用Broadcast实现android组件之间的通信

    android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...

  9. Spark:大数据的电花火石!

    什么是Spark?可能你很多年前就使用过Spark,反正当年我四六级单词都是用的星火系列,没错,星火系列的洋名就是Spark. 当然这里说的Spark指的是Apache Spark,Apache Sp ...

  10. Java采用JDBC的方式连接Hive(SparkSQL)

    前两天,由于系统的架构设计的原因,想通过Java直接访问Hive数据库,对于我这个Java以及Hadoop平台的菜鸟来说,的确是困难重重,不过,还好是搞定了.感觉也不是很麻烦.这篇文章,作为一个感想记 ...