Cookie笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013497151/article/details/44420391

一、Cookie概述


cookie机制采用的是在客户端保持 HTTP 状态信息的方案 

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

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


二、在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所在的Web工程的站点),即: /Cookie



展开阅读全文

没有更多推荐了,返回首页