一、会话跟踪技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束,在一次会话中可以包含多次请求和响应,会话是跟浏览器绑定起来的,同一个浏览器在不关闭的前提下发送了多次请求访问了服务器,这些请求之间称为同一次会话
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
问题提出:
但是因为Http协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,所以服务器不知道该请求是否来自于同一浏览器,服务器不知道那就意味着数据共享共享不了了。如果http协议是有状态的,那意味着在同一次会话中,下一次的请求将要带上上一次请求所有的数据,这样就会导致后边的请求数据体量很大而请求速度变慢,http协议把每一次请求设置为独立的,这样后边的请求就不会受到影响,但是就是因为这个独立性,从而导致服务器不能识别每次请求的关联关系,为了解决这个问题就需要用到会话跟踪技术了。
问题解决方法:
1.客户端会话跟踪技术:Cookie
2.服务端会话跟踪技术:Session
二、Cookie
1、Cookie工作原理
客户端会话技术,将数据保存到客户端,以后每次请求数据都携带Cookie数据进行访问
打个比方:同一个浏览器对服务器发送了两次请求1和2,去请求服务器里的servletA和B,当浏览器发送了请求1去请求服务器里的servletA时,servletA会创建一个cookie对象的数据,当servletA真正做响应的时候又把cookie发送给了客户端浏览器,这时浏览器接收到了cookie的数据并保存到内存里,然后浏览器在同一次会话中发送2请求去请求servletB时,这个时候这个浏览器就会携带者cookie访问servletB,在servletB中我们就可以把cookie携带的数据获取到
Cookie原理:Cookie的实现是基于Http协议的,这里面会涉及到两个头,一个是响应头set-cookie和请求头cookie 当tomcat发现发送的数据是一个cookie时,它会在数据里面加上一个响应头set-cookie,响应头对应的值就是你设置的键值对如:(username=badou),浏览器接收到响应头之后,发现是cookie后,浏览器就把set-cookie响应头解析了,解析了之后就拿到了对应的数据(如:username=badou),拿到之后就把数据保存到了内存里面(关闭浏览器cookie就没了)。当浏览器在同一次会话中访问另一个servletB时,它会自动的用一个请求头cookie携带cookie访问,servletB获取到对应的请求头的数据之后通过request对象把所有的数据封装成对应的cookie对象来获取出来。
Cookie的存活时间:默认情况下cookie存储在浏览器的内存中,当浏览器关闭内存释放,则cookie被销毁。如果需要让它持久化可以用setMaxAge(int seconds)设置cookie存活时间
其中正数:将cookie写入浏览器所在电脑的硬盘,持久化存储,到时间自动删除
负数:默认值,cookie在当前浏览器内存中,当浏览器关闭,cookie销毁
零:删除对应cookie
Cookie存储中文方法:cookie不能直接存中文,如果要存中文那就要把中文的数据转码转成非中文的数据,存完后再解析成中文数据,可用URL编码
用URLEncoder可以转码,用URLDecoder可以解码
String value = "巴豆";
//转码并重新赋值
value = URLEncoder.encode(value,"UTF-8");
Cookie cookie = new Cookie("username",value);
//解码并重新赋值
value = URLDecoder.decode(value);
2、如何使用Cookie
①发送cookie
第一步创建cookie对象,设置数据
Cookie cookie = new Cookie("name","badou");
第二步发送cookie
response.addCookie(cookie);
查询结果可以在浏览器里的设置里看到cookie发送内容
②获取cookie
第一步调用request方法里的getCookies()方法获取cookie,(在浏览器访问当前ocalhost服务器资源的时候,它会把当前localhost下所有的cookie都携带过去,所以我们只能一次性的把所有cookie全部获取出来返回一个cookie数组)
Cookie[] cookies = request.getCookies();
第二步遍历数组,加一个if判断是不是我要所需要的cookie,并使用cookie对象方法获取数据
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("username".equals(name)) {
//获取数据
String value = cookie.getValue();
System.out.println(name + ":" + value);
break;
}
}