A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵天强 中级黑马   /  2012-11-11 15:44  /  1875 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  要想理解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();
        }

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
java后台提供的cookies机制不能像HashMap一样根据key直接取值value,每一次都要for循环所有的cookies,导致不灵活。
所以推荐使用前台JQuery  cookies,可以根据cookies的名字取值,就像使用HashMap的key和value一样。
Cookies.set("name","yyh");   Cookies.get("name");
一般的cookies存储的都是些鸡肋式的数据,不可能存储对安全要求比较高的数据。
所以直接在前台操作,而不需要到用后台cookies类去搞。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马