JavaWeb会话管理:(1)Cookie

会话技术
序号 名称 数据存放位置
1 Cookie技术 会话数据保存在浏览器客户端。
2 Session技术 会话数据保存在服务器端。

1、Cookie技术



1.1、特点


Cookie技术:会话数据保存在浏览器客户端。


1.2、Cookie技术核心


Cookie类:用于存储会话数据。


Cookie核心API
序号 类别 API
1 构造Cookie对象

Cookie(String name, String value)

2 设置cookie

void setPath(String uri)   :设置cookie的有效访问路径

void setMaxAge(int expiry) : 设置cookie的有效时间

void setValue(String newValue) :设置cookie的值

3 发送cookie到浏览器端保存

void response.addCookie(Cookie cookie)  : 发送cookie

4 服务器接收cookie

Cookie[] request.getCookies()  : 接收cookie



1.3、Cookie原理


1)服务器创建cookie对象,把会话数据存储到cookie对象中。

		Cookie cookie = new Cookie("username","lsieun");

2) 服务器发送cookie信息到浏览器

		response.addCookie(cookie);

举例: Set-Cookie: username=lsieun  (隐藏发送了一个Set-Cookie名称的响应头)

JavaWeb会话管理:(1)Cookie_第1张图片

3)浏览器得到服务器发送的cookie,然后保存在浏览器端。

4)浏览器在下次访问服务器时,会带着cookie信息

举例: Cookie: username=lsieun  (隐藏带着一个叫Cookie名称的请求头)

JavaWeb会话管理:(1)Cookie_第2张图片

5)服务器接收到浏览器带来的cookie信息

		Cookie[] cookies = request.getCookies();//接收浏览器发送的cookie信息
		if(cookies != null)
		{
			for(Cookie c : cookies)
			{
				String cookieName = c.getName();
				String cookieValue = c.getValue();
				int cookieAge = c.getMaxAge();
				
				out.write(cookieName + ": " + cookieValue +  ", Age: " + cookieAge);
			}
		}

完整代码:Demo01.java

package com.rk.http.a_cookie;

import java.io.IOException;

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

/**
 * 发送Cookie到浏览器
 * @author lsieun
 *
 */
public class Demo01 extends HttpServlet
{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		Cookie cookie = new Cookie("username","lsieun");//创建Cookie对象
		response.addCookie(cookie);//把cookie数据发送到浏览器
		System.out.println("Cookie Saved!!!");
	}

}

完整代码:ReceiveCookie.java

package com.rk.http.a_cookie;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * 从浏览器接收Cookie
 * @author lsieun
 *
 */
public class ReceiveCookie extends HttpServlet
{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		
		Cookie[] cookies = request.getCookies();//接收浏览器发送的cookie信息
		if(cookies != null)//注意:判断是否为null, 否则空指针
		{
			out.write("<h1>Cookie信息:</h1>");
			for(Cookie c : cookies)
			{
				String cookieName = c.getName();
				String cookieValue = c.getValue();
				int cookieAge = c.getMaxAge();
				
				out.write(cookieName + ": " + cookieValue +  ", Age: " + cookieAge);
			}
		}
		else
		{
			out.write("<h1>没有Cookie信息</h1>");
		}
	}

}

下面通过“HttpServletRequest读取Cookie的请求头”和“HttpServletResponse来设置Set-Cookie的请求头”进行浏览器和服务器端的Cookie传递。

package com.rk.http.a_cookie;

import java.io.IOException;
import java.io.PrintWriter;

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

public class HeaderCookie extends HttpServlet
{
	private int count = 0;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		//1.利用getHeader()获取浏览器的Cookie信息
		String strCookie = request.getHeader("Cookie");
		out.write("从浏览器获取的Cookie信息为:" + strCookie + "<br/>");
		
		int num = 0;
		synchronized (HeaderCookie.class)
		{
			count++;
			num = count;
		}
		
		//2.利用SetHeader()来设置Cookie信息
		response.setHeader("Set-Cookie", "username"+num+"=lsieun"+num);
	}

}




1.4、Cookie的细节

1)void setPath(java.lang.String uri)   :设置cookie的有效访问路径。

有效路径,指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。

2)void setMaxAge(int expiry) : 设置cookie的有效时间。

正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。

负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!

零:表示删除同名的cookie数据

3)Cookie数据类型只能保存非中文字符串类型的。

可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。


示例代码Demo02.java

package com.rk.http.a_cookie;

import java.io.IOException;

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

public class Demo02 extends HttpServlet
{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		/**
		 * 1.创建Cookie对象
		 */
		Cookie cookie1 = new Cookie("username","lsieun");
		Cookie cookie2 = new Cookie("password","123456");
		Cookie cookie3 = new Cookie("email","[email protected]");
		Cookie cookie4 = new Cookie("hobby","swiming");
		
		/**
		 * 2.设置cookie的有效路径。默认情况:有效路径在当前web应用下。
		 */
		cookie1.setPath("/");//有效路径是网站的根目录
		cookie2.setPath(request.getContextPath());//而下面三种效果是一样的
		cookie3.setPath("/myweb");
		//cookie4使用默认值
		
		/**
		 * 3.设置cookie的有效时间
		 * 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
		 * 负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
		 * 零:表示删除同名的cookie数据
		 */
		cookie1.setMaxAge(20);//20秒,从最后不调用cookie开始计算
		cookie2.setMaxAge(-1);//cookie保存在浏览器内存(会话cookie)
		cookie3.setMaxAge(0);//删除同名的cookie数据
		//cookie4使用默认值
		
		/**
		 * 4.把cookie数据发送到浏览器
		 */
		response.addCookie(cookie1);
		response.addCookie(cookie2);
		response.addCookie(cookie3);
		response.addCookie(cookie4);
	}

}



1.5、案例- 显示用户上次访问的时间

package com.rk.http.a_cookie;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

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

public class HistoryCookie extends HttpServlet
{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		/**
		 * 获取当前时间
		 */
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String curTime = format.format(new Date());
		
		Cookie[] cookies = request.getCookies();
		String lastLogonTime = null;
		if(cookies != null)
		{
			for(Cookie c : cookies)
			{
				if(c.getName().equals("lastTime"))
				{
					lastLogonTime = c.getValue();
					
					//1.把上次访问时间显示到浏览器
					out.write("欢迎回来,你上次访问的时间为:" + lastLogonTime + ",当前时间为:" + curTime);
					//2.更新cookie
					c.setValue(curTime);
					c.setMaxAge(1*30*24*60*60);
					//3.把更新后的cookie发送到浏览器
					response.addCookie(c);
					return;//这里没有用break。是因为break之后,会跳出当前循环,再执行后续代码;而return直接退出当前方法。
				}
			}
		}
		
		
		//第一次访问(没有cookie 或 有cookie,但没有名为lastTime的cookie)
		if(cookies == null || lastLogonTime==null)
		{
			//1.显示当前时间到浏览器
			out.write("你是首次访问本网站,当前时间为:" + curTime + "<br/>");
			//2.创建Cookie对象
			Cookie cookie = new Cookie("lastTime",curTime);
			cookie.setMaxAge(1*30*24*60*60);
			//3.把cookie发送到浏览器保存
			response.addCookie(cookie);
		}
		else
		{
			
		}
	}

}




你可能感兴趣的:(cookie)