Servlet学习之cookie

    这次主要说明下cookie的用法,主要包括:

  • 什么是Cookie,有什么用途
  • 怎么使用Cookie
  • 关于Cookie的一些理解
     1.Cookie,英文意思为小饼干。在Servlet中其实是一个很小的缓存文件,储存在客户端的本地硬盘上。主要有以下用途:
  • 记录用户名和密码。方便用户在需要验证的网站无需多次填写用户名和密码
  • 在电子商务网站中标识用户。例如在淘宝我们往购物车里添加商品,通过本地cookie可以让机器理解所添加的商品属于同一个用户,因为客户每次打开一个网页就是一次http请求,打开新的商品信息就会重新与服务器建立新的连接,需要重新验证用户信息,好在cookie帮助了我们,避免了每次打开新的网页都需要验证用户的麻烦。
  • 定制网站。在一些网站上,我们登录后会出现我们自己的主界面,上面的信息都是通过通过cookie来记住我们的喜好而实现的。
  • 定向广告。通过cookie可以让服务器知道你浏览了那些网站信息,当你打开网页的时候,网页上的广告会显示我们最近浏览的网站信息。例如我们在淘宝浏览了篮球信息,我们在浏览其他商品的时候就会跳出篮球的广告。
     2.Cookie是由服务器端设置,发送到客户端本地。我先写个基本的Cookie生成例子:

Cookie cookie = new Cookie("useID","1234")
cookie.setMaxAge(60*60*24*7)
response.addCookie(cookie)
第一步使用Cookie类生成一个cookie对象,设置name和value为useID,1234。第二步通过setMaxAge设置该cookie在客户端有效的时间,上面设置为一年。如果不设置时间,则默认在关闭浏览器即可失效。如果设置为0,表示删除该cookie。第三步使用addCookie方法将cookie发送到客户端。这一步不可漏掉,否则无效。
现在我们已经设置了Cookie,我们怎么读取呢,通过request.getCookies( )方法返回一个cookie对象数组,然后遍历数组,通过getName()得到所需的cookie名称,getValue()得到该cookie的值。没有的话返回为null。基本的Cookie流程就是这样,服务器通过给客户端设置Cookie来标识用户,通过读取客户端的Cookie来识别用户,从而实现上面所说的功能。
      3.关于对Cookie的一些理解已经说得很清楚了,Cookie实现的原理简单但是为了一探究竟,我们通过下载tomcat src源码来加深对Cookie的理解。我们找到javax包中的http包,打开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(LSTRING_FILE);
       
    private String name;	// NAME= ... "$Name" style is reserved
    private String value;	// value of NAME   
    private String comment;	// ;Comment=VALUE ... describes cookie's use
				// ;Discard ... implied by maxAge < 0
    private String domain;	// ;Domain=VALUE ... domain that sees cookie
    private int maxAge = -1;	// ;Max-Age=VALUE ... cookies auto-expire
    private String path;	// ;Path=VALUE ... URLs that see the cookie
    private boolean secure;	// ;Secure ... e.g. use SSL
    private int version = 0;	// ;Version=1 ... means RFC 2109++ style
  
    public Cookie(String name, String value) {
	if (!isToken(name)
		|| name.equalsIgnoreCase("Comment")	// rfc2019
		|| name.equalsIgnoreCase("Discard")	// 2019++
		|| name.equalsIgnoreCase("Domain")
		|| name.equalsIgnoreCase("Expires")	// (old cookies)
		|| name.equalsIgnoreCase("Max-Age")	// rfc2019
		|| 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) {
	comment = purpose;
    }
    public String getComment() {
	return comment;
    }
    public void setDomain(String pattern) {
	domain = pattern.toLowerCase();	// IE allegedly needs this
    }
    public String getDomain() {
	return domain;
    }
    public void setMaxAge(int expiry) {
	maxAge = expiry;
    }
    public int getMaxAge() {
	return maxAge;
    }
    
    public void setPath(String uri) {
	path = uri;
    }

    public String getPath() {
	return path;
    }

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

    public boolean getSecure() {
	return secure;
    }

    public String getName() {
	return name;
    }

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


    public String getValue() {
	return value;
    }


    public int getVersion() {
	return version;
    }


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

   
    private static final String tspecials = ",; ";
    
    
  
    private boolean isToken(String value) {
	int len = value.length();

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

	    if (c < 0x20 || c >= 0x7f || tspecials.indexOf(c) != -1)
		return false;
	}
	return true;
    }


    public Object clone() {
	try {
	    return super.clone();
	} catch (CloneNotSupportedException e) {
	    throw new RuntimeException(e.getMessage());
	}
    }
}
其中各个参数的作用我们来一一查看:
  1. comment属性为Cookie的注释。
  2. domain为Cookie设置的域名。
  3. path为Cookie使用的路径。
  4. secure为Cookie是否使用过安全协议传输。
  5. version为Cookie所遵从的协议版本。
    4.  我们在生成Cookie的时候不仅可以设置setMaxAge(),还可以设置其他属性。至于Cookie的缺点,网络上也讨论的很多。任何技术都有两面性,只要我们合理的利用就能发挥他的最大功能。
      完!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值