1 Cookie
cookie的作用就是在客户端存储一些数据,当浏览器再次请求某个服务器时会携带这些数据从而提供更好的用户体验。
Cookie 是由若干键值对构成,这里的键一般称为 name,值称为 value。 Cookie 中的键值对均为字符串。
cookie小知识
- 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
- 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
- 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
- 删除cookie时,path必须一致,否则不会删除
创建cookie
Cookie cookie = new Cookie("username","ganxuejun");
手动设置cookie绑定路径
cookie.setPath("/path");
设置cookie有效期为一小时
cookie.setMaxAge(60 * 60);
把cookie信息写回到客户端
response.addCookie(cookie);
服务器端获取客户端的所有Cookie对象
Cookie[] cookie = request.getCookies();
获取上一次最后访问的时间
public class CookieDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//获取客户端保留的最后访问时间
Cookie[] cookies = request.getCookies(); //获取客户端的所有Cookie对象
for (int i = 0; cookies!=null && i < cookies.length; i++) {
if("lastAccessTime".equals(cookies[i].getName())){ //判断当前Cookie中的name是否是想要的cookie
long l = Long.parseLong(cookies[i].getValue()); //如果是想要的Cookie,则把Cookie中的value取出
out.write("你最后的访问时间是:"+new Date(l).toLocaleString()); //yyyy-MM-dd
}
}
//创建cookie
Cookie ck = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
//设置cookie的有效时间5分钟
ck.setMaxAge(60*5);
//把cookie信息写回到客户端
response.addCookie(ck);
System.out.println(System.currentTimeMillis());
}
}
2 Session
session介绍
在WEB开发中,服务器可以为每个客户端浏览器创建一个session对象,默认情况下一个浏览器独占一个session对象。在实际应用当中,服务器程序可以把一些敏感数据写到用户浏览器独占的session中可以提高安全性,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
session和cookie的主要区别是:
- session存储在服务器端
- cookie存储在客户端
获取Session对象的方式:
通过调用request对象中的getSession()方法就可以获取Session对象了,不需要手动new创建。
HttpSession session = request.getSession();
Session中常用的方法:
该方法用于向 Session 的中放入一个键值对。
public void setAttribute(String name, Object value)
该方法用于从 Session 中根据名字获取值。
public Object getAttribute(String name)
该方法用于从Session中删除数据。
public void removeAttribute(String name)
Web开发中的 Session机制会为每个浏览器分配了一个 Session。即一个浏览器一个 Session,不同的Session之间的数据不能共享。
session工作原理
- 服务器会为每个浏览器分配一个session,每个浏览器只能访问自己的session对象,可http协议是无状态的,那服务器是如何识别这些浏览器的呢?
- 服务器对Session对象是以Map的形式进行管理的,每创建一个session对象,服务器都会向该Map中的 key放入一个32位长度的随机串,这个随机串称为JSessionID, 之后将该session对象的引用放入到map的value中。
- session放入到Map之后,服务器还会自动将”JSESSIONID”作为 name,32位长度的随机串作为value,放到cookie中并发送到客户端。该cookie会默认放到浏览器的缓存中,只要浏览器不关闭就一直存在。
- 当浏览器第二次向服务器发送请求时会携带该cookie,服务器接收到之后会根据JSessionID从Map中找到与之对应的session对象。
Session的失效
若某个Session 在指定的时间范围内一直未被访问,那么 Session 将超时,即将失效。在 web.xml 中可以通过标签设置 Session 的超时时间,单位为分钟。默认 Session 的超时时间为 30 分钟。这个时间并不是从 Session 被创建开始计时的生命周期时长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的时长。
<!-- 设置失效时间为60分钟 -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
可以在servlet中调用session中的invalidate()方法使session失效:
//使session失效
session.invalidate();
数据空间范围对比
由大到小分别为:
ServletContext—>HttpSession—>HttpServletRequest
- ServletContext,即application,置入其中的数据是整个web应用范围的,可以完成跨会话共享数据。
- HttpSession,置入其中的数据是会话范围的,可以完成跨请求共享数据。
- HttpServletRequest,置入其中的数据是请求范围的,可以完成跨 Servlet 共享数据。但这些 Servlet 必须在同一请求中。