1.会话
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。会话过程中要解决的一些问题?
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。
2.Cookie
将会话相关的数据保存到浏览器中,并且在每次访问服务器时都带过去。基于Set-Cookie响应头和cookie请求头进行工作,将会话产生的数据保存在了客户端。response提供了addCookie方法,可以在响应中增加一个Cookie信息
request提供了getCookies方法,可以获取请求中的所有Cookie信息
javax.servlet.http.Cookie,可以直接利用此类的构造方法创建一个Cookie,创建出来的Cookie需要设置一个名称和值:
new Cookie(String name,String value); 新建一个Cookie对象
Cookie方法:注意,浏览器是根据cookie的名称加上cookie的path来区分是否是同一个cookie的,如果需要覆盖之前的cookie,除了保证名称相同外还要保证path也相同。
setMaxAge与getMaxAge方法:Cookie发送到浏览器时,如果没有设置MaxAge,则当前Cookie信息会被存在浏览器的内存中,当关闭浏览器时,cookie信息就消失掉了(会话级别的cookie)。我们也可以为Cookie设置一个MaxAge,浏览器收到这样的cookie后,会将cookie信息以文件的形式保存在浏览器的临时文件夹中,并且会设置文件的有效期限为maxage的值。这样依赖在超时时间到来之前,浏览器无乱开关多少次,都会带有这个Cookie信息。
setPath与getPath方法:设置浏览器在访问哪个地址及其子地址时带着当前Cookie信息过来,如果不设置setPath这个方法,则默认的值是发送Cookie的Servlet所在的路径做Path
setDomain与getDomain方法 :设置浏览器在访问哪个域名时,带着这个Cookie信息,默认值是当前发送Cookie信息的网站的域名。现代的浏览器,只要cookie设置过domain信息,则浏览器拒绝接受此cookie。
删除一个Cookie:发送一个同名,同path,同domain(不设置)的cookie到浏览器,并设置maxAge为0,使浏览器收到这个Cookie后覆盖旧的Cookie,覆盖后新的Cookie立即超时,被删除,就相当于删除了一个Cookie。
利用cookie实现显示上次访问时间
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
Cookie[] cookies = request.getCookies();
Cookie lastCookie = null;
if(cookies!=null){
for(Cookie c:cookies){
if("last".equals(c.getName())){
lastCookie = c;
break;
}
}
}
if(lastCookie==null){
response.getWriter().write("你是第一次访问本网站");
}else{
response.getWriter().write("上次访问时间:"+new Date(Long.parseLong(lastCookie.getValue())).toLocaleString());
}
Cookie cookie = new Cookie("last",new Date().getTime()+"");
cookie.setPath(request.getContextPath());
cookie.setMaxAge(24*60*60);
response.addCookie(cookie);
}
3.Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。 一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
session是一个域对象,作用范围为整个会话。
Session和Cookie的主要区别在于:
1.Cookie是把用户的数据写给用户的浏览器。
2.Session技术把用户的数据写到用户独占的session中。
Session生命周期
当第一调用到request.getSeesion()方法时,创建出session。当超过30分钟(这个时间可以修改)session都没有人使用,则服务器认为session已经超时,此时,销毁session。明确的调用session.invalidate方法也可以销毁session。当服务器非正常关闭时,session随着服务器销毁而销毁。如果服务器是正常关闭,则存活着的session,会在服务器关闭时,以文件的形式被存储在硬盘用,这个过程叫做session的钝化。服务器在正常启动时,会将钝化在文件中的session在恢复到内存中,这个过程叫做session的活化。