• Cookie笔记


    一、Cookie概述


    cookie机制採用的是在client保持 HTTP 状态信息的方案 

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

     

    一旦WEB浏览器保存了某个Cookie。那么它在以后每次訪问该WEBserver时,都会在HTTP请求头中将这个Cookie回传给WEBserver。


    二、在Servlet中使用Cookie


    Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包括有生成Cookie信息和提取Cookie信息的各个属性的方法。

     
    Cookie类的方法: 
    构造方法: public Cookie(String name,String value)
    getName方法 
    setValue与getValue方法 
    setMaxAge与getMaxAge方法 
    setPath与getPath方法 
    HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中添加一个Set-Cookie响应头字段。


    HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取全部的Cookie项。



    三、会话Cookie和持久Cookie


    假设不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,仅仅要关闭浏览器窗体。cookie就消失了。

    这样的生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。


    假设设置了过期时间。浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器。这些cookie依旧有效直到超过设定的过期时间。
    存储在硬盘上的cookie能够在不同的浏览器进程间共享,比方两个IE窗体。而对于保存在内存的cookie,不同的浏览器有不同的处理方式

    简单演示样例:

    ①用Cookie实现自己主动登录

    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="index.jsp" method="post">
    		<input type="text" name="userName" />
    		<input type="submit" name="Submit" /> 
    	</form>
    </body>
    </html>
    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    	<%
    		String name = request.getParameter("userName");
    		//推断name是否为空
    		if(name!=null && !name.trim().equals("")){
    			Cookie cookie = new Cookie("userName",name);
    			cookie.setMaxAge(30);
    			response.addCookie(cookie);
    		}else{  //为空,找全部的Cookie有没有登录过的记录
    			Cookie[] cookies = request.getCookies();
    			if(cookies!=null && cookies.length > 0){
    				for(Cookie c : cookies){
    					if(c.getName().equals("userName")){
    						name = c.getValue();
    					}
    				}
    			}
    		}
    		//假设找到了,直接进index.jsp,会出现Hello,否则重定向到login.jsp
    		if(name != null && !name.trim().equals("")){
    			out.print("Hello : "+name);
    		}else{
    			response.sendRedirect("login.jsp");
    		}
    	%>
    	
    </body>
    </html>
    ②:实现近期阅览的5本书籍,要求,记录阅览历史,假设超过5本,删除最早阅览的那本的记录,对于已经阅览过的书,而又又一次阅览,删除原来的记录,加入新纪录

    books.jsp

    <%@page import="java.util.ArrayList"%>
    <%@page import="java.util.List"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<a href="book.jsp?

    book=JavaWeb">JavaWeb</a><br><br> <a href="book.jsp?book=Java">Java</a><br><br> <a href="book.jsp?book=Oracle">Oracle</a><br><br> <a href="book.jsp?

    book=Ajax">Ajax</a><br><br> <a href="book.jsp?book=JavaScript">JavaScript</a><br><br> <a href="book.jsp?

    book=Android">Android</a><br><br> <a href="book.jsp?book=Struts">Struts</a><br><br> <a href="book.jsp?

    book=Spring">Spring</a><br><br> <a href="book.jsp?book=Hibernate">Hibernate</a><br><br> <hr> <% //打印符合条件的书名 Cookie[] cookies = request.getCookies(); if(cookies != null && cookies.length > 0){ for(Cookie c : cookies){ if(c.getName().startsWith("com_")){ out.print(c.getValue()); out.print("<br>"); } } } %> </body> </html>

    book.jsp

    <%@page import="java.util.ArrayList"%>
    <%@page import="java.util.List"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h4>Book Detail Page</h4>
    	Book:<%= request.getParameter("book") %>
    	<br><br>
    	
    	<%
    		//获取当前书的名字
    		String book = request.getParameter("book");
    		//设置一个暂时对象,用于推断近期一次点击的书,是否曾经点击过
    		Cookie cookieTep = null;
    		//获取全部的Cookie
    		Cookie[] cookies = request.getCookies();
    		//创建存储符合条件集合,用于存储Cookie
    		List<Cookie> cookieColl = new ArrayList<Cookie>();
    		if(cookies != null && cookies.length > 0){
    			for(Cookie c: cookies){
    				if(c.getName().startsWith("com_")){
    					cookieColl.add(c);
    					//假设曾经点击过,记录曾经的对象
    					if(c.getValue().equals(book)){
    						cookieTep = c;
    					}
    				}
    			}
    		}
    		//若果没有点击过 或者 List的size不满5,就不须要删除最先点击的那个 
    		if(cookieColl.size() >= 5 && cookieTep == null){ //仅仅要大于5就删第一个,所以会一直最多仅仅要5个
    			cookieTep = cookieColl.get(0);
    		}
    		//假设曾经点击过,杀死,并立即回应books.jsp,将曾经点击的Cookie信息杀死
    		if(cookieTep != null){
    			cookieTep.setMaxAge(0);
    			response.addCookie(cookieTep);
    		}
    		//创建最新的点击记录的Cookie,并回应
    		Cookie cookie = new Cookie("com_"+book,book);
    		response.addCookie(cookie);
    	%>
    		
    	<a href="books.jsp">Return</a>
    </body>
    </html>

    Cookie存储实现好像是类似于栈的感觉....

    四、关于Cookie的作用范围


    能够作用于当前文件夹和当前文件夹的子文件夹,但不能作用于当前文件夹的上一级文件夹

    通过 cookie.setPath(request.getContextPath()); 就能够设置Cookie的作用范围(当前的Cookie所在的Webproject的网站),即: /Cookie



  • 相关阅读:
    如何快速查看archlinux pacman 软件记录?
    如何快速判断检查主机ip端口是否存活?
    如何在不清楚有哪些tag的情况下拉取docker镜像?
    如何使用docker版Openresty测试框架Test::Nginx进行测试?
    .net mvc4 使用 System.Web.Optimization 对javascript和style的引入、代码合并和压缩的优化(ScriptBundle,StyleBundle,Bund
    zen coding de 一些快捷功能
    C# Xpath
    一个SQL SERVER查询分析器非常好用的工具
    探索MSSQL执行计划
    博客园武林人士
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7262695.html
Copyright © 2020-2023  润新知