C语言自学完备手册(33篇)
Android多分辨率适配框架
JavaWeb核心技术系列教程
HTML5前端开发实战系列教程
MySQL数据库实操教程(35篇图文版)
推翻自己和过往——自定义View系列教程(10篇)
走出思维困境,踏上精进之路——Android开发进阶精华录
讲给Android程序员看的前端系列教程(40集免费视频教程+源码)
在之间介绍HTTP协议的时候我们提到了:HTTP协议是种无状态协议。无状态是指协议本身对于事务处理没有记忆能力,它只对每次连接和本次连接中的通信负责。
当客户端与服务器进行动态交互的Web应用程序出现之后HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟用户交互是需要承前启后的。例如:在网站购物中选择了多个商品,每个商品对应于一次请求连接;那么,在结账时应该知道一共买了多少种商品。于是,诞生了Cookie和Session这两种用于保持HTTP连接状态的会话技术。
在日常生活中,从拨通电话到挂断电话之间的通话过程可称为一次会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是客户端浏览器与Web服务器之间连续发生的一系列请求和响应过程。例如,用户在网站上的整个购物过程就是一次会话。在本节教程中,我们将介绍Cookie技术。
十多年前,我在美丽的石家庄。裕华路旁有家本地非常出名的商场,叫做北国超市;超市的二楼有一家运动服装专卖店。为了能够享受购物优惠,我在专卖店办了一张折叠式的会员卡(类似于纸质的存折),卡上标注了我的姓名、手机号、家庭住址、消费总额、积分额度等信息。每次去店里买东西,店员都会依据我的消费记录计算优惠额度并累加本次所得积分。类似地,在客户端与Web服务器通信的过程中Cookie的功能就类似于这种折叠式的会员卡。当浏览器访问Web服务器时,服务器可将信息存放在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…
可通过HttpServletRequest的getCookies( )方法获取客户端携带至服务端的Cookie;方法如下:
public Cookie[] getCookies( )
语法如下:
public Cookie(String name, String value)
name表示Cookie的名字,value表示对应的值
可通过HttpServletResponse的addCookie( )方法将Cookie响应至客户端浏览器。
public void addCookie(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常见应用。
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时,结果如下:
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-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>