Cookie
1、Cookie :是存储在客户端 (浏览器管理,存储在客户端电脑的C盘)
2、浏览器一般允许存储300个Cookie,允许每个站点存储20个Cookie,每个Cookie大小不能超过4k。
3、Cookie如果不设置setMaxAge(秒)默认浏览器关闭Cookie就会被删除,如果想要删除该Cookie可以将setMaxAge(0)。
4、浏览器是如何知道那个Cookie对应服务器的呢?
浏览器会将 服务器地址 作为 Cookie的 key,当下次访问 该地址时,会根据key查找出对应的Cookie带过去(我们也可以通国cookie.setPath(“/JavaWebTest”),来改变Cookie的Key,默认情况下只能应用后的地址,不能修改服务器主机。)
(因为如果可以修改主机(例如为:www.xxxx.com),那么每次浏览器访问xxx网站时,都会Cookie,势必造成数据的雍总)。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String key = "lastVisitTime";
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
writer.write("你上次访问的时间是:");
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(int i=0;i<cookies.length; i++ ){
Cookie cookie = cookies[i];
if(key.equals(cookie.getName())){
long LastTime = Long.parseLong(cookie.getValue());
writer.write(new Date(LastTime).toLocaleString());
break;
}
}
}
Cookie cookie = new Cookie(key, String.valueOf(System.currentTimeMillis()));
//设置有效时间
cookie.setMaxAge(30*24*3600);
//告诉浏览器,在访问JavaWebTest应用时将cookie带给服务器,(注意如果没有设置,默认当前Servlet路径)
cookie.setPath("/JavaWebTest");
response.addCookie(cookie);
}
Session
1、Session 是出储存在服务器端(占用服务器内存),Session的Id由Cookie保存,Cookie被禁用后,Session功能也会受到影响。(下面会有分析)
2、Session生命周期:
Session,通过request.getSession() 被创建。默认30分钟没有被使用 Session被服务器销毁。(web.xml 中可以配置时间)或者调用 session.invalidate();
<session-config>
<!-- 10分钟没有使用被销毁 -->
<session-timeout>10</session-timeout>
</session-config>
3、浏览器在访问时,服务器是如何知道该取那个Session 是的呢?
服务器将SessionId 存入 Cookie中 返回给浏览器,浏览器访问时,在通过Cookie的到SessionId。(这里也有一个问题,Cookie默认情况下,浏览器关闭就被销毁,所有Session也就无法获取,解决该问题就必须手动模仿服务器创建的Cookie在覆盖它。)
通过浏览器工具 查看 http请求。你会发现,Cookie里面有这么一行。
session.setAttribute("goods", "笔记本电脑");
String id = session.getId();
Cookie cookie = new Cookie("JSESSIONID", id);
cookie.setMaxAge(30 * 60);// 由于Session默认是 30 分钟失效,这里也设置成30 分钟
response.addCookie(cookie);//这样就会覆盖掉原有的Cookie,下次服务器获取Session时,就会读取到该Cookie。
4、那Cookie被禁用以后怎么办?
session.getSession() 方法会从Cookie中查找SessionId ,如果Cookie被禁用,那么他会从url中查找SessionId,那么我们可以通过URL来传送 SessionId,
String url1 = response.encodeURL("/JavaWebTest/SessionDemo?action=add");
String url2 = response.encodeURL("/JavaWebTest/SessionDemo?action=show");
writer.write("<a href='"+url1+"'>加入购物车</a>");
writer.write("<a href='"+url2+"'>查看购物车</a>");
通过浏览器你会发现地址栏会多JSessionId
response.encodeURL()方法会判断如果getSession方法没有获取到Cookie那么,他会将SessionId附在URL地址后面。这总办法只能解决浏览器没有关闭情况下的Session共享。