javaWeb之Cookie小结

在 Servlet 规范中,常用以下两种机制完成会话跟踪
Cookie 
Session 

Cookie:是完成会话跟踪的一种机制

HTTP协议是一个无状态的协议-- WEB服务器本身无法识别出请求是否是同一个浏览器发出的。
作为WEB服务器,必须能够采取一种机制来唯一的标识一个用户,同时记录该用户的状态。
1)Cookie是在浏览器访问WEB服务的某一个资源时,由WEB服务器在HTTP响应消息头中附带传给浏览器的一个小文本文件。
2)底层实现原理:WEB服务器通过在HTTP响应信息中增加set-Cookie响应头字片段将Cookie信息发送给浏览器
浏览器则通过在HTTP请求信息中增加Cookie请求头字段将Cookie回传到WEB服务器。

Cookie相关的api

1-创建一个Cookie
2-设置Cookie最大失效
3-如何将Cookie传给客户端(添加Cookie)
4-设置Cookie作用范围(默认情况:可以作用在当前目录和当前目录的子目录,但不能作用在当前目录的上一级目录)
5-获取Cookie数组
方法
    A:获取Cookie数组
    Cookie[] ck = request.getCookies();
    B:添加Cookie
    Cookie ck = new Cookie("name","wjc");
    ck.setPath(request.getContextPath());
    C:删除Cookie
    temp.setMaxAge(0);//删除Cookie  注意只能为0不能为负数
    D:设置Cookie作用范围
    Cookie ck = new Cookie("name","wjc");
    ck.setPath(request.getContextPath());//到Cookiex这一级

Cookie的传送过程(注意必须是同一个浏览器)

首先当第一次浏览器发送请求时,请求信息是没有Cookie的而响应信息里面会常见Cookie并且将Cookie添加到Cookie存储区里面
当同一个浏览器再次发送请求时,请求信息里面就有Cookie的信息了响应信息里面也有Cookie的信息。
看图片第一次发送请求.png和第二次发送请求.png

第一次发送请求

第二次发送请求

Cookie的生命周期

默认情况下是一个会话(Session)级别的。存储在浏览器内存中,用户退出浏览器之后被删除。若希望将Cookie存储在磁盘上,
需要设置setMaxAge,以秒为单位。
    会话Cookie(Cookie存储在浏览器)和持久化Cookie(Cookie存储在磁盘) 只要setMaxAge就会变为持久化Cookie

Cookie的作用范围    :

可以作用在当前目录和当前目录的子目录,但不能作用在当前目录的上一级目录

手动设置Cookie的设置范围

    Cookie对象调用setPath方法来设置Cookie的作用范围
    其中/代表WEB站点的根目录
    cookie.setPath(request.getContextPath());

 

案例

A-利用Cookie在一定时间内显示用户名(类似于自动登陆)

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="doLogin.do" method="post">
		<input type="text" name="name"/> <br/>
		<input type="submit" value="sub">
	</form>
</body>
</html>

UserxServlet.java

package cn.itcast.servlet;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserxServlet extends BasicServlet{

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
			String path = req.getServletPath();
			
			String m = path.substring(1,path.indexOf("."));
			
			
			try {
				Method method = getClass().getDeclaredMethod(m,HttpServletRequest.class,HttpServletResponse.class);
				method.invoke(this, req,resp);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}

	private void doLogin(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("doLogin");
		String name = req.getParameter("name");
		if(name !=null && !name.trim().equals("")){
			Cookie ck = new Cookie("name",name);
			ck.setMaxAge(10);
			resp.addCookie(ck);
		}else{
			Cookie[] ck = req.getCookies();
		 		if(ck != null&&ck.length>0){
		 	 		for(Cookie k : ck){
		 	 			if("name".equals(k.getName())){
		 	 				name = k.getValue();
		 	 				break ;
		 	 			}
		 	 		}
		 	 	}
		 	}
		if(name !=null && !name.trim().equals("")){
			req.setAttribute("name", name);
			req.getRequestDispatcher("index.jsp").forward(req, resp);
		}else{
			resp.sendRedirect("login.jsp");
		}
		
		
	}
	
	
}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%
 	
 	String s = (String)request.getAttribute("name");
 %>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	hello : <%=s%>
</body>
</html>

B-利用Cookie按时间顺序只显示5个book的值

book.jsp

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//获取选中的书籍
	String book = request.getParameter("book");
	//获取
	Cookie[] ck = request.getCookies();
	List<Cookie> list = new ArrayList<Cookie>();
	Cookie temp = null;
	
	if(ck!=null&&ck.length>0){
		for(Cookie g:ck){
			if(g.getName().startsWith("Book_")){
				list.add(g);
			}
		}
	}
	
	//加入之前以选的书本
	for(Cookie g:list){
		if(g.getValue().equals(book)){
			temp = g;
			break;
		}
	}
	//加入之前没有的书本
	if(temp == null&&list.size()>=5){
		temp = list.get(0);
	}
	//一定要删除的Cookie
	if(temp != null){
		temp.setMaxAge(-5);//删除Cookie
		response.addCookie(temp);
	}
	
	temp = new Cookie("Book_"+book,book);
	response.addCookie(temp);
%>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>Book Detail Page</h4>
	Book:<%=request.getParameter("book") %>
	<br/><br>
	<a href="books.jsp">Return </a>
</body>
</html>

books.jsp

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		for(int i = 1;i<=11;i++){
	%>
		<a href="book.jsp?book=book<%=i %>">book<%=i %></a><br/><br>
	<%
		}
	%>
	
	<%
		Cookie[] ck = request.getCookies();
		if(ck!=null&&ck.length>0){
			for(Cookie g:ck){
				if(g.getName().startsWith("Book_")){
					out.print(g.getValue()+"&nbsp;&nbsp;&nbsp;");
				}
			}
		}
		
		
		
	%>
</body>
</html>

    C-CookiePath
        看代码CookiePath的read.jsp和write.jsp
            这个是可以成功的
            
        看代码CookiePath2的write1.jsp和read1.jsp
            这个是不能成功的
            
        要成功就添加ck.setPath(request.getContextPath());//到Cookiex这一级

目录结构

write.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie ck = new Cookie("name","wjc");
	response.addCookie(ck);
%>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="CookiePath/read.jsp">ReadCookie</a>
</body>
</html>

read.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie[] ck = request.getCookies();
	String name = null;
	if(ck != null && ck.length>0){
		for(Cookie g:ck){
			if("name".equals(g.getName())){
				name = g.getValue();
				
				}
			}
		}
		
		if(name != null){
			out.print(name+"<br/>");
		}else{
			out.print("sorry there is no Cookie");
		}
%>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

write1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- 与 write.jsp代码一样-->
<%
	Cookie ck = new Cookie("name","wjc");
	ck.setPath(request.getContextPath());//到Cookiex这一级
	response.addCookie(ck);
%>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="../read1.jsp">ReadCookie</a>
</body>
</html>

read1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- 与 CookiePath下的read.jsp代码一样 -->
<%
	Cookie[] ck = request.getCookies();
	String name = null;
	if(ck != null && ck.length>0){
		for(Cookie g:ck){
			if("name".equals(g.getName())){
				name = g.getValue();
				
			}
		}
	}
	
	if(name != null){
		out.print(name+"<br/>");
	}else{
		out.print("sorry there is no Cookie");
	}
%>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值