JavaWeb核心技术系列教程(15)——Cookie


C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

HTTP的无状态特性

在之间介绍HTTP协议的时候我们提到了:HTTP协议是种无状态协议。无状态是指协议本身对于事务处理没有记忆能力,它只对每次连接和本次连接中的通信负责。

当客户端与服务器进行动态交互的Web应用程序出现之后HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟用户交互是需要承前启后的。例如:在网站购物中选择了多个商品,每个商品对应于一次请求连接;那么,在结账时应该知道一共买了多少种商品。于是,诞生了Cookie和Session这两种用于保持HTTP连接状态的会话技术。

会话简介

在日常生活中,从拨通电话到挂断电话之间的通话过程可称为一次会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是客户端浏览器与Web服务器之间连续发生的一系列请求和响应过程。例如,用户在网站上的整个购物过程就是一次会话。在本节教程中,我们将介绍Cookie技术。

Cookie概述

十多年前,我在美丽的石家庄。裕华路旁有家本地非常出名的商场,叫做北国超市;超市的二楼有一家运动服装专卖店。为了能够享受购物优惠,我在专卖店办了一张折叠式的会员卡(类似于纸质的存折),卡上标注了我的姓名、手机号、家庭住址、消费总额、积分额度等信息。每次去店里买东西,店员都会依据我的消费记录计算优惠额度并累加本次所得积分。类似地,在客户端与Web服务器通信的过程中Cookie的功能就类似于这种折叠式的会员卡。当浏览器访问Web服务器时,服务器可将信息存放在Cookie中再返回至客户端。当浏览器再次访问服务器时都会在请求消息头中将Cookie携带至服务端。

Cookie工作原理

  • 当客户端浏览器第一次访问服务器时不存在Cookie,服务器生成Cookie并返回至客户端。服务端向客户端响应消息时可在HTTP响应头字段中增加Set-Cookie响应头字段表示返回至客户端的Cookie;该字段语法如下:

    Set-Cookie:key=value ; Path=Cookie的有效路径;

  • 客户端浏览器收到Cookie后将其保存在本地硬盘。客户端浏览器支持每台Web服务器最多20个Cookie,总计不超过300个,并且将每个Cookie的大小限定为4KB.

  • 当客户端第二次及其以后再访问服务器时会携带Cookie至服务器,服务器可读取Cookie数据。客服端向服务器发起请求时候会在HTTP请求头字段中使用Cookie请求头字段表示发送至服务端的Cookie;该字段中设置的Cookie遵循以下语法:

    Cookie:key1=value1 ; key2=value2…

获取Cookie

可通过HttpServletRequest的getCookies( )方法获取客户端携带至服务端的Cookie;方法如下:

public Cookie[] getCookies( )

构造Cookie

语法如下:

public Cookie(String name, String value)

name表示Cookie的名字,value表示对应的值

响应Cookie

可通过HttpServletResponse的addCookie( )方法将Cookie响应至客户端浏览器。

public void addCookie(Cookie cookie)

Cookie对象常用方法

public String getName( )

该方法用于获取Cookie名称。

public void setValue(String newValue)

该方法用于设置Cookie的值。

public String getValue( )

该方法用于获取Cookie的值。

public void setMaxAge(int expiry)

该方法用于设置Cookie的最大存活时间,单位为秒。如果设置的值为正整数时浏览器会将Cookie信息保存在本地硬盘中;如果设置值为负整数时,浏览器会将Cookie保存在缓存中,当浏览器关闭时Cookie会被删除。如果设置值为0时,则表示通知浏览器立即删除该Cookie。默认情况下,MaxAge属性的值是-1。

public int getMaxAge( )

该方法用于获取Cookie的最大存活时间,单位为秒。

public void setPath(String uri)

该方法用于Cookie的有效路径。 默认情况下,Cookie只对当前访问路径所属的目录及其子目录有效。假若想让某个Cookie对站点的所有目录下的访问路径都有效,应将其Path属性值设置为“/”。

public String getPath( )

该方法用于返回Cookie的有效路径。

public void setDomain(String domain)

该方法用于设置Cookie的域;在涉及到跨越时常

public String getDomain( )

该方法用于获取Cookie的域。

Cookie使用示例

在此,以示例形式介绍Cookie常见应用。

Cookie入门示例

index.html代码如下:




<html>
	<head>
		<meta charset="utf-8">
		<title>indextitle>
	head>
	<body>
	    <h2 align="center" style="color: red;">本文作者:谷哥的小弟h2>
		<h2 align="center" style="color: red;">博客地址:http://blog.csdn.net/lfdfhlh2>
	body>
html>

index.html页面如下:
在这里插入图片描述
CookieTestServlet如下:

package cn.com;

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;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * Cookie示例:
 * Cookie的生成及其遍历
 */
public class CookieTestServlet extends HttpServlet {
	private static final long serialVersionUID = -2621005366193768161L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		//获取Cookie
		Cookie[] cookies = request.getCookies();
		//第一次访问
		if (cookies == null) {
			System.out.println("Cookie为空");
			//生成Cookie
			Cookie nameCookie = new Cookie("name", "tom");
			Cookie genderCookie = new Cookie("gender", "man");
			//将Cookie返回至客户端浏览器
			response.addCookie(nameCookie);
			response.addCookie(genderCookie);
		//第二次及其以后的访问
		}else {
			System.out.println("Cookie不为空 , 打印Cookie的值 , 如下所示:");
			for (int i = 0; cookies != null && i < cookies.length; i++) {
				Cookie cookie = cookies[i];
				//获取Cookie的名称
				String name = cookie.getName();
				//获取Cookie的值
				String value = cookie.getValue();
				System.out.println(name+ "=" + value);
			}
		}
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

	}
}

第一次访问CookieTestServlet时,结果如下:
JavaWeb核心技术系列教程(15)——Cookie_第1张图片
JavaWeb核心技术系列教程(15)——Cookie_第2张图片

第二次及其以后访问CookieTestServlet时,结果如下:
JavaWeb核心技术系列教程(15)——Cookie_第3张图片
JavaWeb核心技术系列教程(15)——Cookie_第4张图片
web.xml如下:


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>Cookie01display-name>
	<welcome-file-list>
		<welcome-file>index.htmlwelcome-file>
		<welcome-file>index.htmwelcome-file>
		<welcome-file>index.jspwelcome-file>
		<welcome-file>default.htmlwelcome-file>
		<welcome-file>default.htmwelcome-file>
		<welcome-file>default.jspwelcome-file>
	welcome-file-list>
	<servlet>
		<servlet-name>cookieTestServletservlet-name>
		<servlet-class>cn.com.CookieTestServletservlet-class>
	servlet>
	<servlet-mapping>
		<servlet-name>cookieTestServletservlet-name>
		<url-pattern>/cookieTestServleturl-pattern>
	servlet-mapping>
web-app>

记录用户上次访问时间

index.html代码如下:




<html>
	<head>
		<meta charset="utf-8">
		<title>indextitle>
	head>
	<body>
	    <h2 align="center" style="color: red;">本文作者:谷哥的小弟h2>
		<h2 align="center" style="color: red;">博客地址:http://blog.csdn.net/lfdfhlh2>
	body>
html>

index.html页面如下:
在这里插入图片描述
CookieTestServlet如下:

package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
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;

/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * Cookie示例:
 * 记录用户上次访问的时间
 * 
 * 注意事项:
 * 对于时间time进行URL编码和解码否则报错:
 * 
 * An invalid character [32] was present in the Cookie value
 * 
 */
public class CookieTestServlet extends HttpServlet {
	
	private static final long serialVersionUID = -2621005366193768161L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		String LAST_ACCESS_TIME = "lastAccessTime";
		String time = null;
		PrintWriter writer = response.getWriter();
		//获取Cookie
		Cookie[] cookies = request.getCookies();
		Cookie timeCookie=null;
		for (int i = 0; cookies != null && i < cookies.length; i++) {
			Cookie cookie = cookies[i];
			//获取表示最后访问时间的Cookie
			if (LAST_ACCESS_TIME.equals(cookie.getName())) {
				timeCookie=cookie;
				break;
			}
		}
		if (timeCookie == null) {
			writer.println("

" + "您是第一次访问该页面,欢迎您" + "

"
); time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); //对时间time进行URL编码 time=URLEncoder.encode(time,"UTF-8"); //创建Cookie用于表示最近一次的访问时间 timeCookie = new Cookie(LAST_ACCESS_TIME, time); //设置Cookie有效期为1个小时 timeCookie.setMaxAge(60*60); //将Cookie响应至客户端浏览器 response.addCookie(timeCookie); } else { time = timeCookie.getValue(); //对时间time进行URL解码 time=URLDecoder.decode(time, "UTF-8"); writer.println("

" + "上次访问时间:" + time + "

"
); time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); //对时间time进行URL编码 time=URLEncoder.encode(time,"UTF-8"); //重新设定Cookie的值 timeCookie.setValue(time); //将Cookie响应至客户端浏览器 response.addCookie(timeCookie); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { } }

结果如下:
在这里插入图片描述
web.xml如下:


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Cookie03display-name>
  <welcome-file-list>
    <welcome-file>index.htmlwelcome-file>
    <welcome-file>index.htmwelcome-file>
    <welcome-file>index.jspwelcome-file>
    <welcome-file>default.htmlwelcome-file>
    <welcome-file>default.htmwelcome-file>
    <welcome-file>default.jspwelcome-file>
  welcome-file-list>
  <servlet>
    <servlet-name>cookieTestServletservlet-name>
    <servlet-class>cn.com.CookieTestServletservlet-class>
  servlet>
  <servlet-mapping>
    <servlet-name>cookieTestServletservlet-name>
    <url-pattern>/cookieTestServleturl-pattern>
  servlet-mapping>
web-app>

你可能感兴趣的:(JavaWeb核心技术系列教程)