JSP Cookie
JSP 通过 Servlet 支持 HTTP Cookie
HTTP Cookie
Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式
Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息
Cookie 除了传递信息,还用来识别回头客
网站识别回头客有三个步骤:
- 服务器脚本发送一系列 cookie 至浏览器,比如名字,年龄,ID 号码等等
- 浏览器在本地机中存储这些信息,以备下次访问时需要
- 当下一次浏览器发送任何请求至服务器时,它会同时将这些 cookie 信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情
在 Servlet 技术基础上,JSP 显然能够提供对 HTTP cookie 的支持
本章节我们将学习 JSP 如何设置、读取或删除 Cookie
Cookie 剖析
Cookie 通常在 HTTP 响应头中设置(JavaScript 也可以设置 cookie)
下面是携带了 HTTP Cookie 的响应头
HTTP/1.1 200 OK Date: Fri, 04 Feb 2015 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=twle; expires=Friday, 04-Feb-17 22:03:38 GMT; path=/; domain=twle.cn Connection: close Content-Type: text/html
HTTP 通过 Set-Cookie 设置 Cookie
Set-Cookie 信息头包含一个键值对,一个 GMT(格林尼治标准)时间,一个路径,一个域名,键值会通过 URL 编码,有效期域是个指令,告诉浏览器在什么时候之后就可以清除这个 Cookie
如果浏览器支持 Cookie,那么它会保存这些信息直到过期,如果用户访问的任何页面匹配了cookie 中的路径和域名,那么浏览器就会将这个 cookie 发回给服务器
一般情况下,携带了 Cookie 的 HTTP 请求头如下
GET / HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc) Host: www.twle.cn Accept: image/gif, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Cookie: name=twle
Cookie 中的中文
JSP 处理 Cookie 时需要对中文进行编码与解码
编码
String str=java.net.URLEncoder.encode("中文","UTF-8"); //编码
解码
String str=java.net.URLDecoder.decode("编码后的字符串","UTF-8"); // 解码
JSP Cookie
JSP 通过 request.getCookies() 方法获取 HTTP 请求中的 cookie,它会返回一个 Cookie 对象的数组
JSP Cookie 对象的方法列表
方法 & 描述 |
---|
public void setDomain(String pattern) 设置 cookie 的域名,如 twle.cn |
public String getDomain() 获取 cookie 的域名,比如 twle.cn |
public void setMaxAge(int expiry) 设置 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,还有目录下的所有子目录 |
public String getPath() 获取 cookie 的路径 |
public void setSecure(boolean flag) 指明 cookie 是否要加密传输 |
public void setComment(String purpose) 设置注释描述 cookie 的目的。当浏览器将 cookie 展现给用户时,注释将会变得非常有用 |
public String getComment() 返回描述 cookie 目的的注释,若没有则返回null |
JSP 设置 Cookie
JSP 设置 cookie 通常有三个步骤
-
创建一个 Cookie 对象
JSP 调用 Cookie 的构造函数,传递字符串格式的 cookie 名称和值做参数
Cookie cookie = new Cookie("key","value");
Cookie 名称和值不能包含空格或者如下的字符
[ ] ( ) = , " / ? @ : ;
-
设置 Cookie 有效期
调用 setMaxAge() 方法设置 cookie 的有效期,下面的调用将有效期设置为 24小时
cookie.setMaxAge(60*60*24);
-
通过 HTTP 响应头发送 cookie
调用 response.addCookie() 方法在 HTTP 响应头中添加 cookie
response.addCookie(cookie);
范例 : 设置 Cookie
首先,通过 response.addCookie()
方法将表单传递来的数据设置到 Cookie 中
webapp/set_cookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.net.*" %> <% // 编码,解决中文乱码 String str = URLEncoder.encode(request.getParameter("name"),"utf-8"); // 设置 name 和 url cookie Cookie name = new Cookie("name",str); Cookie url = new Cookie("url",request.getParameter("url")); // 设置cookie过期时间为24小时。 name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); // 在响应头部添加cookie response.addCookie( name ); response.addCookie( url ); %> <!DOCTYPE html> <meta charset="utf-8"> <title>设置 Cookie - JSP 基础教程 | 简单教程(www.twle.cn)</title> <ul> <li><p><b>网站名:</b> <%= request.getParameter("name")%> </p></li> <li><p><b>网址:</b> <%= request.getParameter("url")%> </p></li> </ul> <p>设置 Cookie - JSP 基础教程 | 简单教程(www.twle.cn)</p>
然后开发一个 HTML 表单通过 POST 方法将 网站名 和 网址 发送到服务器端
webapp/cookie_form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <meta charset="utf-8"> <title>Cookie 表单 - JSP 基础教程 | 简单教程(www.twle.cn)</title> <form action="set_cookie.jsp"> 站点: <input type="text" name="name" method="POST"> <br /> 网址: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> <p>Cookie 表单 - JSP 基础教程 | 简单教程(www.twle.cn)</p>
在浏览器上输入
http://localhost:8080/jsp/cookie_form
显示如下
然后通过浏览器的调试工具查看该网站下的所有 cookie,发现 Cookie 已经设置正确