Javaweb-服务端与客户端的信息识别-Session与Cookie
文章目录
Cookie概述
什么叫Cookie
Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器
Cookie规范
你大可以放心,Cookie不会占满你的硬盘。因为一个Cookie最多只有4KB,并且浏览器最多可以保存300个Cookie。当然,在浏览器大战的今天,一些浏览器为了打败对手,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!但也不会出现把你硬盘占满的可能!
不同的浏览器之间不能共享Cookie
Cookie的作用
Cookie的作用可大了,但无论怎么夸大Cookie的作用都离不开“跟踪客户端状态”这句话。我们知道Cookie是服务器保存在客户端的信息,然后客户端会在下次请求时把Cookie在还给服务器,这样服务器就可以通过信息来识别客户端了
Cookie快速上手
保存Cookie到客户端
这是响应工作的一部分,所以这个方法是response对象的。并且Cookie是HTTP协议中的内容,所以保存Cookie是HttpServletResponse类的方法
void addCookie(Cookie c)
:添加
Cookie对象
到当前response对象中,这个方法可以被调用多次,从而完成添加多个Cookie对象到response中
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
Cookie c = new Cookie("name", "lakesy");
response.addCookie(c);
}
}
服务端读取Cookie:
我们现在已经可以保存Cookie到客户端了,但还没有学习让服务器如何读取Cookie。
如果浏览器保存了Cookie,那么会在下一次请求时把Cookie放到请求头中发送给服务器,这时服务器需要在请求中读取Cookie。既然是在请求中读取,那么当然是使用request对象来读取了
HttpServletRequest:Cookie[] getCookies()
注意,它返回的是
Cookie数组
,而不是一个Cookie对象。如果请求中
没有Cookie,那么该方法返回null
Cookie[] cs = request.getCookies();
if (cs != null) {
for (Cookie c : cs) {
String str = c.getName() + ": " + c.getValue() + "<br/>";
response.getWriter().print(str);
}
}
response.getwriter().print()
是响应给客户端的东西,如果不用ajax接收将数据放在合适的位置,就会在浏览器上生成一个新的页面来显示内容
Cookie的生命周期
Cookie会在客户端存活多久呢?这就是Cookie的生命了。默认情况下,Cookie只在浏览器的内存中存活,也就是说,当你关闭浏览器后,Cookie就会消失
可以使用
Cookie#setMaxAge(int expiry)
来设置Cookie的存活时间。参数expiry表示Cookie存活的秒数
-
cookie.setMaxAge(60*60)
:表示cookie对象可存活1小时。就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时。因为
当maxAge大于0时,浏览器不仅会把cookie保存在浏览器内存中,还会把cookie保存到硬盘上
。 -
cookie.setMaxAge(-1)
:cookie的maxAge属性的默认值就是-1(其实只要是负数都是一个意思),表示只在浏览器内存中存活,
一旦关闭浏览器窗口,那么cookie就会消失
-
cookie.setMaxAge(0)
:cookie被作废!表示cookie即不在内存中存活,也不在硬盘上存活,这样的cookie设置只有一个目的,那就是覆盖客户端原来的这个cookie,使其作废
Session概述
ession也是域对象之一,它的范围是在一个
会话范围
内有效。session既然是域对象,那么当然就要有getAttribute()和setAttribute()系列方法了
在一个会话内共享一个session对象,所以session中可以保存
一个会话内的数据
。例如当前用户的信息
session的
范围大于request
,可以在
一个会话中多个请求之间共享数据
。但session的范围小于
ServletContext(application)
,session
不能在多个用户之间共享数据
目前所学过的域对象的作用范围:
ServletContext > HttpSession > HttpServletRequest
使用
request.getSession()
方法就可以获取session对象
有了session,就
不用使用Cookie来跟踪会话
了!但是session不能像Cookie那样长命,一旦用户关闭浏览器窗口,那么session就死掉了
Session原理
我们都知道HTTP是无状态协议,但是为什么session可以跟踪会话状态呢?没错,session依赖Cookie
当客户端第一次访问服务器时,服务器会为客户端创建一个session对象,然后把session对象放到session池中,在响应时把sessionId通过Cookie响应给客户端。注意,只有在第一次访问时,服务器才会创建session,给客户端响应sessionId。从此以后就不会了
当客户端再次访问服务器时,会在请求中带着sessionId给服务器,服务器通过sessionId到session池中找到session对象,这就可以完成会话跟踪了。也就是说,服务器端保存的是session对象,而客户端只有sessionId。每次访问都需要通过客户端的sessionId来匹配服务器端的session对象!这样用户在session中保存的数据就可以再次被使用了
sessionId是服务器通过Cookie发送给客户端浏览器的
,这个Cookie的maxAge为-1,即只在浏览器内存中存在。如果你关闭所有浏览器窗口,那么这个Cookie就会消失了
Session失效
session失效有如下几个原因:
-
session.invalidate()
方法注销session -
session超时
<session-config>
<!-- session的超时时间,以分钟为单位 -->
<session-timeout>1</session-timeout>
</session-config>
- Cookie被禁用