Cookie 小摘

浏览器访问服务器时,由服务器在HTTP响应头中附带给浏览器的一片数据(也就是COOKIE)。
这时,浏览器可以决定是否要接受这一片数据,如果接受了,那他在以后请求服务器时,就会在请求头上附加这一片数据给服务器端。


服务器端,响应头增加Set-Cookie响应头字段(即COOKIE)
一个COOKIE只能标识一种信息,它的格式有:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

NAME=VALUE:

  这是每一个Cookie均必须有的部分。NAME是该Cookie的名称,VALUE是该Cookie的值。在字符串“NAME=VALUE”中,不含分号、逗号和空格等字符。

  Expires=DATE:Expires变量是一个只写变量,它确定了Cookie有效终止日期。该属性值DATE必须以特定的格式来书写:星期几,DD-MM-YY HH:MM:SS GMT,GMT表示这是格林尼治时间。反之,不以这样的格式来书写,系统将无法识别。该变量可省,如果缺省时,则Cookie的属性值不会保存在用户的硬盘中,而仅仅保存在内存当中,Cookie文件将随着浏览器的关闭而自动消失。

  Domain=DOMAIN-NAME:Domain该变量是一个只写变量,它确定了哪些Internet域中的Web服务器可读取浏览器所存取的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。这项设置是可选的,如果缺省时,设置Cookie的属性值为该Web服务器的域名。

  Path=PATH:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie。一般如果用户输入的URL中的路径部分从第一个字符开始包含Path属性所定义的字符串,浏览器就认为通过检查。如果Path属性的值为“/”,则Web服务器上所有的WWW资源均可读取该Cookie。同样该项设置是可选的,如果缺省时,则Path的属性值为Web服务器传给浏览器的资源的路径名。

  可以看出我们借助对Domain和Path两个变量的设置,即可有效地控制Cookie文件被访问的范围。

  Secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。

其实,COOKIE的工作就像一个结点,它可以把浏览器访问的同一个服务器上的所有程序连在一起,然后在这些程序上传递一些信息。
COOKIE的共享问题出现了,比如,现在有多个浏览器窗口,他们如何对待COOKIE呢?
如果设置了COOKIE的生命周期,它会存在于硬盘,这样的话,多个浏览器会共享COOKIE。
但是,如果只是保存在内存中,对于IE来说,多个浏览器是不共享的,FireFox则可以共享。 

以下再摘:
1:具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择

2:CSDN通常会有一个自动登录的功能,它的原理是:

当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。这个cookie应该保存了用户名和密码,当然密码通常不是明文的,通常会用MD5来加密。下次请求连接时,服务器就会判断是否自动连接,如果要自动连接,则获得用户名和口令登录。

3:cookie可以记录用户定制站点的信息,对于简单的设置,可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。

4:怎么发送Cookie呢?

当然要先创建一个cookie对象,创建完以后就要选择是否是持久cookie还是会话cookie,即是否设置最大时效,
接着是将Cookie放入到HTTP响应报头。
发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。响应报头必须在任何文档内容发送到客户端之前设置。

Cookie c = new Cookie(“userId”,”landril”);

c.setMaxAge(60*60*24);//以秒为单位

response.addCookie(c);

5:在4中创建了cookie,在客户端怎么接收呢?
 cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。
例如:
  String cookieName = “userID”;
    Cookie cookies[] = request.getCookies();//返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
    if (cookies!=null){//下面要做的就是找到所要的cookie
        for(int i=0;i    Cookie cookie = cookies[i];
                if (cookieName.equals(cookie.getName())){
        doSomethingWith(cookie.getValue());//判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。
}}}
6:统计访问次数
   1.获取cookie数组中专门用于统计用户访问次数的cookie的值
   2.将值转换成int型
   3.将值加1并用原来的名称重新创建一个Cookie对象
   4.重新设置最大时效
   5.将新的cookie输出

7:保存session id:cookie+url+hidden

8:session在下列情况下被删除:
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止

9:URL重写有什么缺点
   对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
   这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。  
使用隐藏的表单域有什么缺点
    仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程

10:getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象
getSession(false):当session存在时返回该session,否则不会新建session,返回null

11:setAttribute会替换任何之前设定的值;如果想要在不提供任何代替的情况下移除某个值,则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound
方法。(通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean。
如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象)

12:public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系,则这个方法返回true,这一般是因为会话是新建的,不是由输入的客户请求所引起的。但如果isNew返回false,只不过是说明他之前曾经访问该Web应用,并不代表他们曾访问过我们的servlet或JSP页面。因为session是与用户相关的,在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用,session可以是当前页面创建,也可能是由用户之前访问过的页面创建的。正确的做法是判断某个session中是否存在某个特定的key且其value是否正确

13:通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。
此时我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。

14:如何使用会话显示每个客户的访问次数
由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值
  但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如:
HttpSession session = request.getSession();
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
if (value= =null){
    value = new SomeImmutableClass(…); // 新创建一个不可更改对象
}else{
    value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象
}
session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象
15:cookie的常用方法

1、 setComment()/getComment():指定或查找与该cookie相关的注释

2、 setDomain()/getDomain():设置或读取该cookie适用的域

3、 setMaxAge()/getMaxAge():操作cookie保留的时间,多长时间后过期

4、 getName():读取cookie的名称

5、 setPath()/getPath():设置或取得cookie适用的路径

cookie.setPath(“/”);指定服务器的所有页面都应该收到该cookie

6、 setSource()/getSource():指定cookie是否只能通过加密连接(SSL)

默认false,表示cookie适用所有连接

7、 setValue()/getValue():指定或获取cookie的值

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值