会话管理——Cookie
会话主要内容:怎样保存、获取、操作用户数据。
会话:可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个Web资源,然后关闭浏览器,整个过程称之为一个会话。
会话过程中要解决的一些问题?
每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结账servlet时,结账servlet可以得到用户商品为用户结账。
思考:用户购买的商品保存在request或servletContext中行不行?
不能存在request中,因为一个用户请求(输入一个网址),会产生一个request。当用户点击购买产生一个request,又点击付款会再产生一个新的request。如下图:
但是如果点击购买后,利用forward转发给payservlet可以共用一个request。但这样用户体验不好,点击购买,马上转发到结账。即你点购买,网站就让你结账,多烦啊。
存在ServletContext更不行,因为它是共享的,所有请求只产生一个ServletContext。
那么在web开发中保存用户数据用什么方法呢?
Cookie和Session。
一、保存会话数据的两种技术:
1、Cookie:是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。
当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。
这样,web资源处理的就是用户各自的数据了。
2、Session:是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,
由于session为用户浏览器独享,所以用户在访问服务器的web资源时,
可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,
其它web资源再从用户各自的session中取出数据为用户服务。
二、Cookie API
Javax.servlet.http.Cookie类用于创建一个Cookie,response接口中也定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类的方法:
1、public Cookie(java.lang.String name, java.lang.String value)
2、setValue和getValue
3、setMaxAge和getMaxAge
4、setPath和getPath
5、setDomain和getDomain 这两个方法设定的Cookie通常会被浏览器禁用,因为它们都是第三方Cookie,容易对别的网站造成安全隐患。
6、getName方法 获取Cookie的名称
例1、显示用户上次访问时间
新建Java Web project:Day07,在Day07src下新建一个Servlet:CookieDemo1 ,代码如下:
package cn.itcast.cookie;
import java.io.*;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out =response.getWriter();
out.print("您上次的访问时间是:");
//获得用户的时间Cookie
Cookie cookies[]=request.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++)
{
if(cookies[i].getName().equals("lastAccessTime")){
//得到用户上次访问的时间
long cookieValue =Long.parseLong(cookies[i].getValue());
Date date =new Date(cookieValue);
out.print(date.toLocaleString());
}
}
//给用户送去上次访问时间
Cookie cookie =new Cookie("lastAccessTime",System.currentTimeMillis()+"");
cookie.setMaxAge(1*30*24*3600);
cookie.setPath("/Day07");
response.addCookie(cookie); //把cookie写给浏览器
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
在浏览器中输入:http://localhost:8088/Day07/servlet/CookieDemo1
结果是: 您上次的访问时间是:
刷新后,结果是: 您上次的访问时间是:2012-12-5 16:31:28
再刷新.......
三、Cookie细节
1、一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
2、一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器可以存储多个WEB站点提供的Cookie。
3、浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
4、如果创建了一个Cookie,并将他发送到浏览器,默认情况下它是一个会话级别的Cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在硬盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该Cookie。
5、注意,删除cookie时,path必须一致,否则不会删除。
例2、删除Cookie