会话
用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
会话跟踪
HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求。有时我们需要实现数据共享。所以我们需要一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
Cookie
浏览器的设置,安全和隐私设置,cookie及其他网站数据,查看所有 Cookie 和网站数据。
Cookie 基本使用
创建Cookie对象,设置数据:
Cookie cookie = new Cookie("key","value");
发送Cookie到客户端:使用response对象:
response.addCookie(cookie);
模拟跳转资源共享cookie:
在一个servlet用上面的方法创建和响应cookie,再在另一个servlet获取到浏览器携带的所有cookie,并从中找出自己需要的(遍历):
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();
cookie原理
第一次访问服务器,响应的时候:
已经携带cookie后访问的时候,浏览器会将所有的cookie都带上:
cookie存活时间:
正数:将 Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则 Cookie被销毁
零:删除对应 Cookie
cookie.setMaxAge(7*24*60*60);
为了验证,我们先筛选出localhost的
到期时间确实在7天之后了。
cookie默认不支持中文
先在第一次访问服务器的时候将cookie数据进行URL编码,再在浏览器访问的时候解码,绕开这个问题。
Cookie cookie = new Cookie("username", "佳佳");
response.addCookie(cookie);
会直接报错。
解决办法,对中文进行转码:
String value = "佳佳";
value = URLEncoder.encode(value, "UTF-8");
Cookie cookie = new Cookie("username", value);
response.addCookie(cookie);
获取cookie的时候再转码回来:
for (Cookie cookie : request.getCookies()) {
String value = cookie.getValue();
String decode = URLDecoder.decode(value, "UTF-8");
System.out.println(cookie.getName() + ":" + decode);
}