Session
session是一种位于服务端,用于存储一个会话(指打开浏览器访问某个域名,及其下面的资源,然后关掉浏览器的过程)中所需的配置信息。也就是在一个会话中,只存在一个session。对于java web编程来说,session就是在request.getSession()创建的。同样,session也可以通过setMaxInactiveInterval()设置其最大闲置时间(默认为30分钟,可以通过tomcat管理员登录观察)。
session的结构类似一个map。可以根据需求put不同的key和value进去。通常,用作登录状态的保持(这样需要session跟踪,后面会说到),可以减少多次登录困扰。
用Java代码体验下这一过程:
PrintWriter writer = response.getWriter();
HttpSession session = request.getSession();
// 设置session有效时间为1天
session.setMaxInactiveInterval(60 * 60 * 24);
if (session.isNew()) {
session.setAttribute("name", "cjt");
writer.write("新建Session成功");
} else {
writer.write(session.getAttribute("name").toString());
}
每个会话第一次与服务端产生交互,请求头Request Header是不包含任何cookie的,所以跟踪不到session,isNew()返回true;然后在同一次回话中,接下来的访问都返回false,调试看看很明显:
对于tomcat容器来讲,getSession()默认会生成一个id为JSESSIONID的session,然后set-cookie保存到客户端(会话cookie),但是session默认最大闲置时间是30分钟,所以第二次会话时上次的名为JESSIONID的cookie会丢失,但是session还存在服务器端。
Cookie
cookie是指为了辨别身份、进行 session 跟踪而储存在本地终端上的数据(通常经过加密),也可以叫做浏览器缓存。cookie是由服务端发出set-cookie指令,客户端根据设置的cookie信息创建本地cookie。
一个cookie可看做一个实体类,里面存有当前cookie的name、value、maxage、path等。在访问path路径及其子路径时,会封装一系列相关的cookie集合到Request Header中,发送到服务器。
具体java代码就是在服务端完成,记住创建了cookie对象后要添加到response中:
// 设置临时Cookie,只存在一次会话中,默认值
Cookie tempCookie = new Cookie("temp", "tempCookie");
tempCookie.setMaxAge(-1);
response.addCookie(tempCookie);
// 设置瞬时Cookie,浏览器收到Cookie立即删除
Cookie cookie = new Cookie("cookie", "666");
cookie.setMaxAge(0);
response.addCookie(cookie);
// 设置常驻Cookie
Cookie userCookie = new Cookie("user", "cjt");
userCookie.setMaxAge(60 * 60 * 24);
response.addCookie(userCookie);
在火狐下通过开发者调试可以看到:
敲黑板!!重点是响应头(Response Header)里面的Set-Cookie,这里面可以看到设置的三个cookie。然后通过浏览器cookie查看:
瞬时cookie已经删掉了,会话cookie和常驻cookie还在,可以关掉浏览器,再次访问该路径查看cookie,这是就只有设置的常驻cookie了。
特别注意
在实际开发中,可能需要我们手动更改cookies的内容,那么cookie并不提供update,只有add方法。这里就要采取覆盖的方式更新了。
举个例子,你把购物车的信息都在cookie key为cart的本地常驻cookie中,然后添加了商品到购物车,这里就要更新该cookie。重点就在这里,java里面获取到key为cart的cookie,你会发现只能取到里面的key和value,path和maxage都获取不到,具体原因我也不清楚。
如果此时强行采取添加覆盖的方式,就会增加了一个会话cookie到客户端。而之前的常驻购物车cookie并没有改变。所以得每次手动设置path和maxage为了和之前保持一致,这样才能达到更新的目的。