1.会话概述:
1.当用户通过浏览器访问Web应用时,通常情况下,服务器需要对用户的状态进行跟踪,在Web开发中,服务器跟踪用户信息的技术称为会话技术。
2.在客户端与服务器端交互的过程中也会产生一些数据。例如用户甲和已,分别登录了购物网站。甲购买了一个手机,已购买了一个iPad。当这两个用户结账时Web服务器需要对用户甲和乙的信息分别进行保存。
3.HttpServletRequest对象和ServletContext对象都可以分别对数据进行保存,但是这两个对象都不可用来保存会话数据,具体原因如下:
(1)客户端请求W0b服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失
(2)使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分那些商品是哪个用户购买的,而会将该购物网站中所有的商品进行结算。
2.什么是Cookie
在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡,卡上记录用户的个人信息(姓名,手机号等)、消费额度和积分额度等。顾客一旦接受了会员卡,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。在web应用中,Cookie的功能类似于这张会员卡,当用户通过浏览器访问web服务器时,**服务器会给客户端发送一些信息,这些信息都保存在Cookie中。**这样,当该浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
服务器向客户端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段(此功能由服务器自主完成)。Set-Cookie头字段中设置的Cookie遵循以下语法格式
Set-Cookie: user=wang; Path=/;
在上述示例中,user表示Cookie的名称,wang表示Cookie的值,Path表示Cookie的属性。需要注意的是,Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号和空格分隔。
Cookie在浏览器和服务器之间的传输过程:
说明:
当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器。一旦用户浏览器接受了服务器发送的Cookie信息,就会将它保存的浏览器的缓冲区中。这样,当浏览器后续访问该服务器时,都会在请求消息中将用户信息以Cookie的形式发送给Web服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。
3.Cookie API
为了封装Cookie信息,在Servlet API中提供了一个javax.servlet.http.Cookie类,该类包装了生成Cookie信息和提取Cookie信息各个属性的方法。
1.Cookie的构造方法
Cookie类有且仅有一个构造方法,具体语法如下:
public Cookie(java.lang.String name,java.lang.String value)
其中参数name用于指定Cooie名称,value用于指定Cookie的值。需要注意的是,Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任何值,创建后允许被修改。
2.Cookie类的常用方法
Cookie类的常用方法:
方法声明 | 功能描述 |
---|---|
public String getName() | 该方法返回 cookie 的名称。名称在创建后不能改变。 |
public void setValue(String newValue) | 该方法设置与 cookie 关联的新值。 |
public String getValue() | 该方法获取与 cookie 关联的值。 |
public void setMaxAge(int expiry) | 该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。如果为负整数,浏览器关闭时Cookie信息删除,如果为0时,则通知浏览器立即删除这个Cookie信息 |
public int getMaxAge() | 该方法返回 cookie 的最大生存周期(在客户机上保持的有效秒数),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。 |
public void setPath(String uri) | 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。 |
public String getPath() | 该方法获取 cookie 适用的路径。 |
public void setDomain(String pattern) | 该方法设置 cookie 适用的域,例如 runoob.com。 |
public String getDomain() | 该方法获取 cookie 适用的域,例如 runoob.com。 |
public void setVersion(int v) | 用于设置Cookie项采用的协议版本 |
public int getVersion() | 返回Cookie项采用的协议版本 |
public void setComment(String purpose) | 设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
public String getComment() | 获取 cookie 的注释,如果 cookie 没有注释则返回 null。 |
public void setSecure(boolean flag) | 该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送(使用安全协议传送)。 |
public boolean getSecure( ) | 返回该Cookie项是否只能使用安全的协议传送 |
4.案例-显示用户上次访问时间
创建Servlet类LastAccessServlet
public class LastAccessServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String lastAccessTime=null;
//获取所有cookie
Cookie[] cks=request.getCookies();
//遍历cks数组
for(int i=0;cks!=null&&i<cks.length;i++) {
if("lastAccess".equals(cks[i].getName())) {
lastAccessTime=cks[i].getValue();
break;
}
}
//判断是否存在cookie=lastAccess
if(lastAccessTime==null) {
response.getWriter().write("您是首次访问本站!");
}else{
response.getWriter().write("您上次访问的时间是:"+lastAccessTime);
}
//创建cookie,将当前时间作为cookie的值发送给客户端(浏览器)
String currentTime=new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(new Date());
//存着这一个值,当下次访问时检索到lastAccess则表明不是第一次访问,并且存下上次最后访问的时间
Cookie cookie=new Cookie("lastAccess", currentTime);
//发送cookie
response.addCookie(cookie);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
运行结果:
刚访问:
刷新页面: