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. SceneKit一个3D场景角色的代码重构

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

  2. VBA find方法

    Sub Sample() Dim sfzs As New Collection Dim ws, wbs, dbs As Worksheet Dim r As Long Set ws = ThisWor ...

  3. 值集&快速编码(Lookup_code)

    --值集 SELECT ffv.flex_value, ffv.description   FROM fnd_flex_values_vl ffv, fnd_flex_value_sets ffs   ...

  4. Hadoop:Hadoop单机伪分布式的安装和配置

    http://blog.csdn.net/pipisorry/article/details/51623195 因为lz的linux系统已经安装好了很多开发环境,可能下面的步骤有遗漏. 之前是在doc ...

  5. 仿淘宝购物车demo---增加和减少商品数量

    在上一篇博客中,小编简单的介绍了如何使用listview来实现购物车,但是仅仅是简单的实现了列表的功能,随之而来一个新的问题,买商品的时候,我们可能不止想买一件商品,想买多个,或许有因为某种原因点错了 ...

  6. linux常用的内核镜像格式

    linux常用的内核镜像格式 Linux内核有多种格式的镜像,包括vmlinux.Image.zImage等. 1.     Linux内核镜像格式 1.1 vmlinux vmlinuz是可引导的. ...

  7. 05 Activity知识

    1.Activity          >概念:活动面板   应用程序组件  可以绘制Ui界面  可以和用户进行交互     默认展示全屏  其他情况 界面比其他窗口小  悬浮在其他窗口上方   ...

  8. hive中使用case、if:一个region统计业务(hive条件函数case、if、COALESCE语法介绍:CONDITIONAL FUNCTIONS IN HIVE)

    前言:Hive ql自己设计总结 1,遇到复杂的查询情况,就分步处理.将一个复杂的逻辑,分成几个简单子步骤处理. 2,但能合在一起的,尽量和在一起的.比如同级别的多个concat函数合并一个selec ...

  9. 如何设制 select 不可编辑 只读

    1. <select style="width:195px" name="role"  id="role" onfocus=" ...

  10. Git版本控制:Gitlab及Coding.net的使用

    http://blog.csdn.net/pipisorry/article/details/50709014 Gitlab介绍 GitLab是利用 Ruby on Rails 一个开源的版本管理系统 ...