Cookie和Session学习笔记

Cookie

什么是Cookie

Cookie就是由服务器发送给客户端的特殊信息,这些信息以文本文件的方式存放在客户端。在此后的每次客户端向服务器发送请求时都会带上这些信息。有了Cookie这样的技术,服务器在接受到用户发送的请求后,可以通过分析存放在请求头中(Request Header)的Cookie来获取特有信息,从而动态生成内容返回给用户。

有两个HTTP头部是专门负责设置以及发送Cookie的,他们分别是Set-Cookie以及Cookie。当服务器返回给客户端一个HTTP响应信息时,其中如果包括Set-Cookie这个头部是,意思是指示客户端建立一个Cookie,并且在后续的HTTP请求中自动发送这个Cookie,知道这个Cookie过期。



Cookie的优点

Web应用程序是使用HTTP协议传输数据,但HTTP协议是一种无状态的协议。一旦数据交换完毕,客户端和服务器的连接就会关闭,再次交换数据需要建立新的链接。这就意味着服务器无法从链接上跟踪会话。即用户A买了一件商品放到了购物车内,当再次购买时服务器一件无法判断该购买行为是A的会话还是B的会话了。所以需要一种机制来跟踪会话,Cookie就是这样一种技术,弥补了HTTP协议的不足。可以吧Cookie技术看做是HTTP协议的扩展。


Cookie的生命周期

Cookie的maxAge决定了Cookie的有效期,单位为秒。Cookie中使用setmaxAge()和getmaxAge()方法来操作Cookie的生命周期。

如果maxAge为正数,表示Cookie会在maxAge秒之后自动失效,浏览器会将maxAge为整数的Cookie持久化,写到对应的Cookie文件中存放于硬盘上。无论用户关闭浏览器或是电脑,只要maxAge没有到期那么该Cookie在请求服务器时仍然有效。下面代码就是设置Cookie永久有效。

Cookie cookie = new Cookie( "username" , "helloweenvsfei" ); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE
response.addCookie(cookie); // 输出到客户端

如果maxAge为负数,则表示该Cookie仅在本浏览器以及本窗口打开的子窗口内有效,当窗口关闭后Cookie就失效。此Cookie为临时性Cookie,不会被持久化,不会被写到文件放到硬盘上。而临时性Cookie保存在浏览器的内存中,关闭浏览器该Cookie就消失了。Cookie的maxAge默认值是-1。


如果maxAge为零,则表示删除该Cookie。失效的Cookie会被浏览器在内存或者文件中删除。


Cookie的删除和修改

Cookie并不提供修改和删除的方法。如果需要修改某个Cookie,需要新建一个同名从Cookie,添加到Response中覆盖原来的Cookie。如果需要删除某个Cookie,需要新建一个同名的Cookie,并将maxAge设置成0,并添加到Response中覆盖原来的Cookie。

注意:在修改和删除Cookie的时候,新建的Cookie除了Value和maxAge之外所有的属性,例如name,path,domain等都需要和原来的Cookie一致,否则浏览器将视为两个Cookie不予覆盖。


Cookie的域名

Cookie是不可跨域名的,www.baidu.com颁发的Cookie不会被提交到www.google.com去。保证用户信息安全。

正常情况下,同一个一级域名下的两个二级域名如www.zhidao.baidu.com和www.news.baidu.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想使所有的baidu.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数。

Cookie cookie = new Cookie( "time" , "20080808" ); // 新建Cookie
cookie.setDomain( ".helloweenvsfei.com" ); // 设置域名
cookie.setPath( "/" ); // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期
response.addCookie(cookie); // 输出到客户端


Cookie的路径

domain属性决定了运行访问Cookie的域名,而path属性决定允许访问的路径。例如,只允许/Session/下的程序使用Cookie。

Cookie cookie = new Cookie( "time" , "20080808" ); // 新建Cookie
cookie.setPath( "/session/" ); // 设置路径
response.addCookie(cookie); // 输出到客户端

设置为“/”时,允许所有路径使用Cookie,path属性也需要使用符号“/”结尾。name相同路径不同的两个Cookie视为不同的Cookie。


Session


什么是Session

除了使用Cookie,web应用程序还经常使用Session来记录客户端的状态。Session是服务端使用的一种记录客户端状态的机制。不同于Cookie保存在客户端浏览器中,Session保存在服务器上。客户端访问浏览器时,服务器会吧客户端的信息以某种形式记录在服务器上,这就是Session。当客户端再次访问的时候,只需要从该Session中查找该客户状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确认客户信息的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立一份客户档案,客户来访问的时候只需要查询用户档案表就可以了。


Session的特点

Session对应的类为javax.servlet.http.HttpSession类。每一个来访者对应一个Session对象,所有该客户的信息都会保存在这个Session中。Session对象是在客户端第一次请求服务器的时候创建。Session也是通过Key-Value的属性对,通过getAttribute(String Key)和setAttribute(String key,Object value)方法来读写客户信息。Servlet里通过request.getSession()方法获取该客户的Session。例如:

HttpSession session = request.getSession();       // 获取Session对象
session.setAttribute( "loginTime" , new Date());     // 设置Session中的属性
out.println( "登录时间为:" +(Date)session.getAttribute( "loginTime" ));      // 获取Session属性
request还可以使用getSession(boolean create)来获取Session。区别是如果该客户的Session不存在,request.getSession()方法会返回null,而getSession(true)会先创建Session再将Session返回。


Session的生命周期

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。

Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。


Session的常用方法

Session中包括各种方法,使用起来要比Cookie方便得多。Session的常用方法如下所示。

void setAttribute(String attribute, Object value):设置Session属性。value参数可以为任何Java Object,通常为Java Bean,value信息不宜过大 。

String getAttribute(String attribute):返回Session属性

Enumeration getAttributeNames():返回Session中存在的属性名

void removeAttribute(String attribute):移除Session属性

String getId():返回Session的ID。该ID由服务器自动创建,不会重复

long getCreationTime():返回Session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get >CreationTime())

long getLastAccessedTime():返回Session的最后活跃时间。返回类型为long

int getMaxInactiveInterval():返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效

void setMaxInactiveInterval(int second):设置Session的超时时间。单位为秒

void putValue(String attribute, Object value):不推荐的方法。已经被setAttribute(String attribute, Object Value)替代

Object getValue(String attribute):不被推荐的方法。已经被getAttribute(String attr)替代

boolean isNew():返回该Session是否是>新创建的

void invalidate():使该Session失效


Session的对浏览器的要求

虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。

因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session


Url地址重写

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,例如:

< td >
     < a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>">
     Homepage</ a >
</ td >

该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。重写后的输出可能是这样的:

< td >
     < a href="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=1&wd=Java">Homepage</ a >
</ td >

即在文件名的后面,在URL参数的前面添加了字符串“;jsessionid=XXX”。其中XXX为Session的id。分析一下可以知道,增添的jsessionid字符串既不会影响请求的文件名,也不会影响提交的地址栏参数。用户单击这个链接的时候会把Session的id通过URL提交到服务器上,服务器通过解析URL地址获得Session的id。

response.encodeURL(String url):如果客户端支持Cookie,生成原URL地址,如果不支持Cookie,传回重写后的带有jsessionid字符串的地址。

Cookie与Session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上;
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;








# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升级。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值