Cookie详解

Cookie:

Cookie是保存在客户端计算机上的文本文件,保留了各种跟踪信息,Servlet支持Http Cookie的多种操作。

识别返回用户的三个步骤:

1、服务器脚本向浏览器发送一组Cookie。

2、浏览器将这些信息存储在本机计算机上,后面可以获取使用。

3、当下一次浏览器向Web服务器发送任何请求时,浏览器会把这些Cookie信息发送到服务器,服务器将使用这些信息来识别用户。

Cookie处理需要对中文进行编码和解码操作:

编码操作:

String str1 = java.net.URLEncoder.encode("需要编码的字符","UTF-8");

解码操作:

String str2 = java.net.URLDecoder.decode("编码后的字符串","UTF-8");

Servlet提供的操作Cookie的方法:

操作Cookie的方法方法的描述
public void setDomain(String pattern)设置Cookie适用的域
public String getDomain获取Cookie适用的域
public void setMaxAge(int expiry)设置cookie的过期时间(单位为秒),如果不设置,则cookie只在当前session中持续有效。
public int getMaxAge()返回cookie的最大生存周期(单位为秒),默认情况下,-1表示cookie将持续下去,直到浏览器关闭。
public String getName()返回cookie的名称,名称在创建后不能改变。
public void setValue(String newValue)设置与Cookie关联的值。
public String getValue()获取与Cookie关联的值。
public void setPath(String uri)设置cookie适用的路径,如果不指定路径,与当前相同目录下的所有URL都会返回cookie。
public String getPath获取cookie适用的路径
public void setSecure(boolean flag)该方法设置布尔值,表示cookie是否应该只在加密的(SSL)连接上使用。
public void setComment(String purpose)设置cookie的注释,该注释在浏览器向用户呈现cookie时非常有用。
public String getComment获取cookie的注释,如果cookie没有注释,返回null

通过Servlet创建并保存Cookie:

1、创建一个Cookie对象。

通过调用带有cookie名称和值的Cookie构造函数来创建cookie对象,名称和值都是字符串,且不能包含[]()=,"/?@:;这些字符。

2、设置最大生存周期。

3、发送Cookie到HTTP响应头。

public void doGet(HttpServletRequest request,HTTPServletResponse response) throws ServletException,IOException {
    Cookie cookie  = new Cookie("name","tom");    //创建一个Cookie对象
    cookie.setMaxAge(60*60*24*7);                 //设置最大生存周期
    response.addCookie(cookie);                   //发送Cookie到HTTP响应头
}

案例:创建并保存Cookie

1、创建ServletDemo2类。

package servletdemo;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 创建并保存Cookie
 * @author chengjunyu
 *
 */
@WebServlet("/getFormContent")
public class ServletDemo2 extends HttpServlet{
	public static final long serialVersionUID = 1L;
	
	public ServletDemo2() {
		super();
	}
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
		// 创建两个Cookie
		Cookie name = new Cookie("name", URLEncoder.encode(request.getParameter("name"), "UTF-8"));		
		Cookie password = new Cookie("password", request.getParameter("password"));
		// 为两个 Cookie 设置过期日期为 24 小时后
		name.setMaxAge(60*60*24);
		password.setMaxAge(60*60*24);
		// 在响应头中添加两个 Cookie
		response.addCookie(name);
		response.addCookie(password);
		// 设置响应内容类型
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		String htmlStr = "<!DOCTYPE html>\n";
		htmlStr += "<html>\n";
		htmlStr += "<head><title>Cookie测试</title></head>\n";
		htmlStr += "<body>\n";
		htmlStr += "<p>姓名:"+request.getParameter("name")+"</p>\n";
		htmlStr += "<p>密码:"+request.getParameter("password")+"</p>\n";
		htmlStr += "</body></html>";
		
		out.println(htmlStr);
	}
	
	public void doPost(HttpServletRequest request,HttpServletResponse response) 
		throws ServletException,IOException {
		doGet(request, response);
	}
}

2、修改web.xml文件,增加对ServletDemo2类的访问路径。

3、创建一个html文件,填写表单后提交到ServletDemo2访问路径。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>form表单提交后获取Cookie</title>
<style>
	* {
		padding: 0;
		margin: 0;
	}
	.wrapper-outer {
		margin: 100px auto;
		width: 400px;
		height: 200px;
		border: 1px solid black;
		text-align: center;
	}
	h2 {
		padding-top: 20px;
	}
	.wrapper-inner {
		padding-top: 30px;
		font-size: 20px;
		line-height: 36px;
	}
	.cancel,.submit {
		width: 60px;
		height: 28px;
	}
</style>
</head>
<body>
	<form class="wrapper-outer" action="/servletdemo/getFormContent" method="GET">
		<h2>提交表单后获取cookie</h2>
		<div class="wrapper-inner">
			<p>姓名:<input type="text" value="" placeholder="请输入姓名" name="name"></p>
			<p>密码:<input type="password" value="" placeholder="请输入密码" name="password"></p>
			<input type="button" value="取消" class="cancel">
			<input type="submit" value="提交" class="submit">
		</div>
	</form>	
</body>
</html>

结果:


通过Servlet读取Cookie

如果要读取Cookie,需要通过调用HttpServletRequest的getCookies()方法创建一个Cookie对象的数组,然后通过循环遍历数组并使用getName()和getValue()方法来访问每个cookie和关联的值。

案例:读取ServletDemo2中创建的Cookie。

1、创建ServletDemo3类,类中包含读取Cookie的方法。

package servletdemo;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/getCookies")
public class ServletDemo3 extends HttpServlet{
	public static final long serialVersionUID = 1L;
	
	public ServletDemo3() {
		super();
	}
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws
		ServletException,IOException {
		//获取Cookie数组
		Cookie[] cookies = request.getCookies();
		Cookie cookie = null;
		String cookieName = null;
		String cookieValue = null;
		//设置响应类型
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		String htmlStr = "<!DCTYPE html>\n";
		htmlStr += "<html>\n";
		htmlStr += "<head><title>获取Cookie值</title></head>\n";
		htmlStr += "<body>\n";
		//循环遍历cookies并读取值
		for(int i=0;i<cookies.length;i++) {
			cookie = cookies[i];
			cookieName = cookie.getName();
			//可能带有中文,进行解码操作
			cookieValue = URLDecoder.decode(cookie.getValue(),"UTF-8");
			
			htmlStr += "<p style='font-size:18px;line-height=28px;'>名称:"+cookieName+"</p>";
			htmlStr += "<p style='font-size:18px;line-height=28px;'>值:"+cookieValue+"</p>";
		}
		htmlStr += "<body></html>";
		
		out.println(htmlStr);
	}
	
	public void doPost(HttpServletRequest request,HttpServletResponse response)
		throws ServletException,IOException{
		doGet(request, response);
	}
}

2、修改web.xml文件,增加对ServletDemo3类的访问路径。

<servlet>
  <!-- 类名 -->
  <servlet-name>ServletDemo3</servlet-name>
  <!-- 类所在的包 -->
  <servlet-class>servletdemo</servlet-class>
</servlet>
<servlet-mapping>
  <!-- 类名 -->
  <servlet-name>ServletDemo3</servlet-name>
  <!-- 访问路径 -->
  <url-pattern>/servletdemo/getCookies</url-pattern>
</servlet-mapping>

结果:

通过Servlet删除Cookie:

如果需要删除Cookie,只需要读取一个现有的cookie,并且将其保存到Cookie对象中,然后使用setMaxAge()方法,设置该cookie的有效事件为0,即可删除现有的Cookie,设置完成后,将这个cookie通过addCookie()方法添加到头消息中。

案例:删除Cookie信息

1、创建ServletDemo4 类,类中包含了删除Cookie的方法,将Cookie的有效时间设置为0。

package servletdemo;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/deleteCookies")
public class ServletDemo4 extends HttpServlet{
	public static final long serialVersionUID = 1L;
	
	public ServletDemo4() {
		super();
	}
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws
		ServletException,IOException {
		//获取Cookie数组
		Cookie[] cookies = request.getCookies();
		Cookie cookie = null;
		String cookieName = null;
		String cookieValue = null;
		//设置响应类型
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		String htmlStr = "<!DCTYPE html>\n";
		htmlStr += "<html>\n";
		htmlStr += "<head><title>获取Cookie值</title></head>\n";
		htmlStr += "<body>\n";
		if(cookies != null) {
			//循环遍历cookies并读取值
			for(int i=0;i<cookies.length;i++) {
				cookie = cookies[i];
				cookieName = cookie.getName();
				//可能带有中文,进行解码操作
				cookieValue = URLDecoder.decode(cookie.getValue(),"UTF-8");
				//对比获取到的cookie的key,值为true
				if(cookieName.compareTo("password")==0) {
					//设置cookie的有效期为0s
					cookie.setMaxAge(0);
					//将无效cookie记录
					response.addCookie(cookie);
				}
				
				htmlStr += "<p style='font-size:18px;line-height=28px;'>名称:"+cookieName+"</p>";
				htmlStr += "<p style='font-size:18px;line-height=28px;'>值:"+cookieValue+"</p>";
			}
		}
		
		htmlStr += "<body></html>";
		
		out.println(htmlStr);
	}
	
	public void doPost(HttpServletRequest request,HttpServletResponse response)
		throws ServletException,IOException{
		doGet(request, response);
	}
}

2、在web.xml文件中增加ServletDemo4的访问路径

<servlet>
  <servlet-name>ServletDemo4</servlet-name>
  <servlet-class>servletdemo</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>ServletDemo4</servlet-name>
  <url-pattern>/deleteCookie</url-pattern>
</servlet-mapping>

结果:

在ServletDemo4中设置Cookeie的名字等于“password”的情况下,这个cookie信息被删除,结果与预期相同,不再显示password的cookie。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值