• JavaWeb Cookie详解


    代码地址如下:
    http://www.demodashi.com/demo/12713.html

    Cookie的由来

    首先我们需要介绍一下,在Web开发过程中为什么会引入Cookie。我们知道Http协议是一种无状态协议,
    Web服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。
    即便在Http1.1支持了持续连接,但当用户有一段时间没有提交请求时,连接也会自动关闭。这时,作为Web服务器,
    必须采用一种机制来唯一标识一个用户,同时记录该用户的状态。于是就引入了第一种机制:Cookie机制。

    Cookie机制: 采用的是在客户端保持Http状态的方案。

    Cookie的定义即基本介绍

    Cookie是在浏览器访问WEB服务器的某个资源时,
    由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。

    1. 一旦WEB浏览器保存了某个Cookie,
      那么它在以后每次访问该WEB服务器时,
      都会在HTTP请求头中将这个Cookie回传给WEB服务器。
    2. 一个Cookie只能标识一种信息,
      它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
    3. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,
      一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
    4. 浏览器一般只允许存放300个Cookie,
      每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

    Cookie的原理

    底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,
    浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。

    Cookie的传送过程示意图

    1. Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。
    2. Cookie类的方法:
      • 构造方法: public Cookie(String name,String value)
      • getName方法
      • setValue与getValue方法
      • setMaxAge与getMaxAge方法
      • setPath与getPath方法
    3. HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。
    4. HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。

    Cookie的发送

    1. 创建Cookie对象
    2. 设置最大时效
    3. 将Cookie放入到HTTP响应报头
      • 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie; 存储在浏览器的内存中,用户退出浏览器之后被删除。
        若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
      • 发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP响应报头中。
        由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此将这个方法称为是addCookie,而非setCookie。

    Cookie的读取

    1. 调用request.getCookies要获取浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,
      这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
    2. 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止。

    会话cookie和持久cookie的区别

    1. 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。
      这种生命期为浏览器会话期的cookie被称为会话cookie。
      会话cookie一般不保存在硬盘上而是保存在内存里。
    2. 如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
      设置过期时间: setMaxAge(param) param为具体的时间,单位为秒。
    3. 存储在硬盘上的cookie可以在不同的浏览器进程间共享,
      比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

    具体实现

    实现自动登录过程

    //正常登录进入该页面,name是存在的
    		String name = request.getParameter("name");
    		String check = request.getParameter("checked");
    		if(name == null || name.equals("")){
    			//判断cookie存不存在
    			Cookie[] cookies = request.getCookies();
    			if(cookies != null && cookies.length > 0){
    				for(Cookie cookie : cookies){
    					String cookieName = cookie.getName();
    					if(cookieName.equalsIgnoreCase("demoname")){
    						name = cookie.getValue();
    						break;
    					}
    				}	
    			}
    			//不存在说明cookie过期或者非法访问,否则输出正确内容
    			if(name == null || name.equals("")){
    				response.sendRedirect("demo1.jsp");	
    			}
    			else{
    				Cookie cookie = new Cookie("demoname",name);
    				cookie.setMaxAge(60);
    				response.addCookie(cookie);//设置持久化cookie,存储在磁盘中
    				out.println("hello " + name + "
    ");
    				out.println(System.currentTimeMillis());
    			}
    		}else{
    			if(check != null && check.equalsIgnoreCase("on")){
    				Cookie cookie = new Cookie("demoname",name);
    				cookie.setMaxAge(60);//设置持久化cookie
    				response.addCookie(cookie);
    			}
    			out.println("hello " + name + "
    ");
    			out.println(System.currentTimeMillis());
    		}
    

    实现最近浏览记录功能

    //把书的信息以 Cookie 方式传回给浏览器,删除一个 Cookie
            //1. 确定要被删除的 Cookie: tommyyangcn开头的 Cookie数量大于或等于 5,
            //且若从 books.jsp 页面传入的 book不在 tommyyangcn开头的 Cookie集合中则删除较早的那个 Cookie(tommyyangcn开头的Cookie集合的第一个 Cbookie),若在其中,则删除该 Cookie
            //2. 把从 books.jsp 传入的 book 作为一个 Cookie 返回
    
    	    final String cookieFinalName = "tommyyangcn"; 
    		//使用List(队列机制)存储cookie,第一个是访问时间最久的
    	    List<Cookie> bookList = new ArrayList<Cookie>();
    		String bookName = request.getParameter("bookName");
    		out.print("欢迎在线观看:" + bookName);
    		Cookie[] cookies = request.getCookies();
    		Cookie tempCookie = null;
    		if(cookies != null && cookies.length > 0){
    			for(Cookie cookie : cookies){		
    				String thisCookieName = cookie.getName();
    				//填充cookie的存储空间
    				if(thisCookieName.startsWith(cookieFinalName)){
    					bookList.add(cookie);
    				}
    				//看当前书籍是否在cookie数组中
    				if(cookie.getValue().equals(bookName)){
    					tempCookie = cookie;	
    				}
    			}
    		}
    		//说明当前书籍不在cookie数组中,则将当前书籍加入最近浏览的cookie数组中,同时删除访问时间最久的书籍,对于list集合来说,即第一个
    		if(tempCookie == null && bookList.size() > 0){
    			tempCookie = bookList.get(0);
    		}
    		//tommyyangcn开头的 Cookie数量大于或等于 5,删除需要删除的那个cookie,即tempCookie
    		if(bookList.size() >= 5 && tempCookie != null){
    			tempCookie.setMaxAge(0);
    			response.addCookie(tempCookie);
    		}
    		
    		Cookie cookie = new Cookie(cookieFinalName + bookName, bookName);
    		response.addCookie(cookie);
    

    How to run code

    1. 将代码clone到本地,使用eclipse导入代码,导入的时候项目的类型选择"git project"。
    2. 右键项目 run on Server。

    法二: 将项目中WebContent中的内容拷入你的Tomccat服务器下的webapps目录下你建的站点名,
    然后启动tomcat服务器,
    在浏览器中输入: http://localhost:8080/站点名,即可访问

    Tomcat目录下的webapps目录如下:

    站点页面展示

    项目文件结构截图

    JavaWeb Cookie详解

    代码地址如下:
    http://www.demodashi.com/demo/12713.html

    注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    js刷新
    getHibernateTemplate()为NUll
    struts2+hibernate+spring+jquery返回json List列表
    windowopen
    web配置详解
    缓存
    uuid-不好之处
    多对多转化一对多
    多对多拆成两个 多对一
    我的github地址账号和密码
  • 原文地址:https://www.cnblogs.com/demodashi/p/9436568.html
Copyright © 2020-2023  润新知