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,这是javaee1.8api的jar包,解压后可用javadoc2chm制作成chm帮助文档。
javaweb/javaEE常用jar包,亲测可用,导入到java工程中使用
javaee-api-7.0-javadoc.jar 中文版,使用谷歌翻译,导入idea后可以提示中文
javaee-api-5.jar 如果帮到你了,在评论里美言几句吧
java javaee-api-6.0-5
netbeans-7.1.2-ml-javaee-windows.part2
javaee-api-6.0.jar.....................
`javaee-api-5-license.txt`文件很可能包含了该库的许可协议信息,对于开源软件,了解这些许可条款非常重要,因为它们定义了用户可以如何使用、修改和分发代码。 总的来说,`javaee-api-5.1.2.jar`是JavaEE开发的...
java运行依赖jar包
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 ...
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包免费版是一款在java开发中十分重要的jar包,如果您的java架包内缺少了这款javaee api 7.0.jar将会导致您的开发十分的不流畅,马上下载javaee api 7.0.jar包使用吧。 基本简介 jar包就是别人...
从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 8.0的API文档,它以Javadoc的形式提供,这是一种标准的工具,用于从Java源代码中提取注释,生成格式化的、详细的技术文档。 Javadoc是Sun ...
在"javaee-web相关api"这个主题下,我们将探讨其中的一些关键知识点。 1. **JDK 6.0 API 中文版**: JDK(Java Development Kit)是Java编程的基础,包含了编译器、调试器、JVM(Java Virtual Machine)以及标准API...
JavaEE-Turorial-源码 是一套专门为学习Java企业级应用开发提供的教程源代码,它与《JavaEE-Turorial-教材》配套使用,旨在帮助开发者深入理解JavaEE平台的各种技术,并通过实际操作来提升技能。JavaEE(Java ...
1. **Servlet**:Servlet是JavaEE中的核心组件之一,用于处理HTTP请求和响应。它扩展了Web服务器的功能,使得服务器能够处理动态内容。Servlet API定义了Servlet类和ServletConfig接口,以及Servlet生命周期相关的...
本压缩包中的"javaee-API"显然关注了三个关键部分:Hibernate-API、jsp-API和servlet-API,这些都是JavaEE体系中的重要组件。 **Hibernate-API**: Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者...