要想理解cookie和session的作用,首先要理解什么叫做会话
可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话
会话过成功解决的一些问题?
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据,需要用到cookie和session。
保存会话数据的两种技术
1.1、Cookie
Cookie技术是客户端技术,程序把每个用户的数据以cookie的形式写给用户的各自浏览器,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
注意:如果创建的cookie不设置时间的话,服务器传给客户端的cookie保存在IE缓冲区中,当浏览器关闭后,就不存在了,要想使cookie保存在硬盘中,则要使用cookie中的setMaxAge()方法设定它的保存时间。
1.1.1、cookie的一些常用方法
javax.servlet.http.Cookie类用户创建一个Cookie,response接口中也定义了增加cookie的方法:addCookie,它用户在其相应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies()方法,它用户获取客户单提交的Cookie,Cookie常用的方法
构造方法:
Cookie(java.lang.String name, java.lang.String value)
setValue和getValue
setValue与getValue方法:获取和设置其Cookie的值
setMaxAge和getMaxAge
setMaxAge(int expiry) Sets the maximum age of the cookie in seconds.
getMaxAge() Returns the maximum age of the cookie, specified in seconds, By default, -1 indicating the cookie will persist until browser shutdown.
注意:如果不设置此时间,cookie的保存时间是一个会话时间,当浏览器关闭后,创建的cookie就会消失。
setPath与getPath方法
用此方法可以设置cookie在硬盘的保存路径。如果setPath方法设置/day05,说明当浏览器访问day05下的所有资源时,都会带着cookie来,如果设置为/day05/a,说明当浏览器访问day05下的a下的所有资源时,都会带着cookie来。此时如果是day05/b,则此时不会带cookie。
如果没有设置路径,则有效路径是什么呢?这需要看创建cookie的程序在那个目录下,则cookie的有效范围就是这个目录。
setDomain和getDomain方法:设置cookie的有效域。
什么是有效域呢?举个列子:www.sina.com:主机名,为整个网站,.ina.com:为域
如果调用setDomain方法设置,则参数应为:.sina.com
getName:获取cookie的名称。
1.1.2、cookie的细节
(1)一个cookie只能标识一种信息,它至少含有一个标识该信息的名称(name)和设置值(value)
(2)一个WEB站点可以给浏览器发送多个cookie,一个浏览器也可以存储多个WEB站点提供的cookie
(3)浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个cookie的大小限制为4KB。
(4)如果创建了一个cookie,并将它发送给浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户推出浏览器之后即被删除,若希望浏览器将该cookie存储在磁盘上,则需要使用setMaxAge方法,并给出一个以秒为单位的时间。将最大时效设为0,则是命令浏览器删除该cookie
(5)注意,删除cookie时,path必须一致,否则不会删除。
1.1.3、cookie的应用
应用一:显示用户上次访问的时间。
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 cookie1=null;
for(int i=0;cookies!=null&&i<cookies.length;i++){
cookie1=cookies[i];
if(cookie1.getName().equals("time")){
String time=cookie1.getValue();
long times=Long.parseLong(time);
String date=new SimpleDateFormat("yyyy-MM-dd").format(new Date(times));
out.print("上次访问的时间为:"+date);
}
}
//把本次登录的时间设置到cookie中去
long time=System.currentTimeMillis();
Cookie cookie=new Cookie("time",time+"");
//设置保存的时间
cookie.setMaxAge(60*20);
response.addCookie(cookie);
}
应用二:显示上次浏览过的商品。
网站首页
//网站首页
public class CookieDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
//1.显示网站所有商品
out.print("本网站有如下书籍:<br/>");
Map<String,Book> map = DB.getMap();
for(Map.Entry<String, Book> entry : map.entrySet()){
Book book = entry.getValue();
out.print("<a href='/day07/servlet/CookieDemo3?id="+book.getId()+"' target='_blank'>"+book.getName()+"</a><br/>");
}
out.print("您曾经看过如下商品:<br/>");
//2.显示用户曾经浏览过的商品 // bookHistory
Cookie cookie = null;
Cookie cookies[] = request.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++){
if(cookies[i].getName().equals("bookHistory")){
cookie = cookies[i];
}
}
if(cookie!=null){
//找到了bookHistory这个cookie
String bookHistory = cookie.getValue(); //4_6_1
String ids[] = bookHistory.split("\\_");
for(String id: ids){
Book book = (Book) DB.getMap().get(id);
out.print(book.getName() + "<br/>");
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
class DB{
private static Map<String,Book> map = new HashMap();
static{
map.put("1", new Book("1","javaweb开发","张三"));
map.put("2", new Book("2","jdbc开发","李四"));
map.put("3", new Book("3","struts2开发","王五"));
map.put("4", new Book("4","spring开发","张三"));
map.put("5", new Book("5","hibernate开发","赵六"));
}
public static Map getMap(){
return map;
}
}
class Book{
private String id;
private String name;
private String author;
public Book() {
super();
// TODO Auto-generated constructor stub
}
public Book(String id, String name, String author) {
super();
this.id = id;
this.name = name;
this.author = author;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
对浏览过的书籍进行处理
//显示商品详细信息
public class CookieDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
//1.根据用户带过来的id值,显示相应商品的信息
out.print("您想看的书的详细信息为:<br/>");
String id = request.getParameter("id");
Book book = (Book) DB.getMap().get(id);
out.print(book.getId() + "<br/>");
out.print(book.getName() + "<br/>");
out.print(book.getAuthor() + "<br/>");
//2.以cookie的形式回写该商品的id号给浏览器
String bookHistory = makeCookie(book.getId(),request);
Cookie cookie = new Cookie("bookHistory",bookHistory);
cookie.setMaxAge(10000);
response.addCookie(cookie);
}
//根据用户原来看过的书,以及现在看的书的id,构建新的cookie值
private String makeCookie(String id, HttpServletRequest request) {
//bookHistory=null 3 bookHistory=3
//bookHistory=2_1_5 3 bookHistory=3_2_1
//bookHistory=2 3 bookHistory=3_2
//bookHistory=2_3 3 bookHistory=3_2
//1.得到用户曾经看过的书
String bookHistory = null;
Cookie cookies[] = request.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++){
if(cookies[i].getName().equals("bookHistory")){
bookHistory = cookies[i].getValue();
}
}
if(bookHistory==null){
bookHistory = id;
return bookHistory;
}
//bookHistory=1_2_5 代表用户曾经看一些书,接着程序要得到用户曾经看过什么书
String ids[] = bookHistory.split("_");
//为了检测数组中是否包含当前id,我们应该把数据转成集合,并且还要转成链表结构的集合
LinkedList<String> idList = new LinkedList(Arrays.asList(ids));
/*if(idList.contains(id)){
//bookHistory=2_3 3 bookHistory=3_2
idList.remove(id);
idList.addFirst(id);
}else{
//bookHistory=2_1_5 3 bookHistory=3_2_1
if(idList.size()>=3){
idList.removeLast();
idList.addFirst(id);
}else{
//bookHistory=2 3 bookHistory=3_2
idList.addFirst(id);
}
}*/
if(idList.contains(id)){
idList.remove(id);
}else{
if(idList.size()>=3){
idList.removeLast();
}
}
idList.addFirst(id);
StringBuffer sb = new StringBuffer();
for(String lid: idList){ //1_2_3_
sb.append(lid + "_");
}
return sb.deleteCharAt(sb.length()-1).toString();
} |