会话之Cookie
cookie简介
在登录某个网站时,比如登录163邮箱的网站,界面中有个十天免登陆的选项,先不勾选该选项,登录成功之后关闭浏览器或重启电脑,当再次访问163邮箱时会提示用户登录,这说明http协议是无状态的,在不同的请求之间是无法进行数据传递的。
而当勾选了十天免登陆的选项并登录成功之后,关闭浏览器或者重启电脑,之后再次访问163邮箱时就会自动登录了。这说明用户登录的一些信息保存到了该电脑的硬盘中(默认会存在浏览器的缓存中,可以设置保存在硬盘上),当访问163邮箱网站时,浏览器会将这些数据发送到服务器,从而实现了自动登录的功能,客户端电脑中用于保存这数据的资源,称为cookie。
用户在勾选十天免登陆的选项并登录成功之后,由服务器生成 Cookie,并将其封装到响应头中,以响应的形式发送给浏览器。浏览器接收到这个响应后,将 Cookie 保存到硬盘中。当浏览器再次发送同类请求后,在请求中会携带保存在硬盘的Cookie数据,发送到服务端,由服务器对解析该Cookie。
Cookie 技术并不是 JavaWeb 开发专属技术,而是属于 Web 开发的技术,是所有 Web 开
发语言均支持的技术。Cookie 是由若干键值对构成,这里的键一般称为 name,值称为 value。 Cookie 中的键值对均为字符串。
总的来说cookie的作用就是在客户端存储一些数据,当浏览器再次请求某个服务器时会携带这些数据从而提供更好的用户体验。
JavaEE中的cookie技术
cookie的默认绑定路径
创建一个servlet:
package com.monkey1024.servlet;
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的默认绑定路径
*
*/
public class CookieTest01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie,第一个参数类似map的key,第二个参数类似map的value,不能存中文
Cookie cookie1 = new Cookie("username","monkey1024");
Cookie cookie2 = new Cookie("password","123456");
//将Cookie添加到相应中
response.addCookie(cookie1);
response.addCookie(cookie2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
在web.xml中将上面的servlet的url-pattern设置为:/test/cookie01
访问该servlet时,可以通过fiddler中看到响应头中携带了之前设置的cookie信息。此时两个cookie与默认资源路径http://localhost:8080/07-03-cs/test 进行了绑定,也就是url-pattern中的上一级路径,当再次访问路径包含以上资源路径的url时,会自动将cookie放到请求头中向服务器发出请求。
设置绑定路径
cookie除了默认绑定之外我们还可以手动设置其绑定路径:
package com.monkey1024.servlet;
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的手动绑定路径
*
*/
public class CookieTest02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie
Cookie cookie1 = new Cookie("username","monkey1024");
Cookie cookie2 = new Cookie("password","123456");
//手动设置绑定路径
cookie1.setPath("/aaa");
cookie2.setPath("/aaa");
//将Cookie添加到相应中
response.addCookie(cookie1);
response.addCookie(cookie2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
此时会将绑定路径设置为:http://localhost:8080/07-03-cs/aaa 即访问的url中包含该路径时才会携带cookie数据。
设置cookie的有效时长
默认情况下, Cookie 是保存在浏览器的缓存中的,关闭浏览器后Cookie也就消失了。
开发者可以通过设置Cookie的有效时长,将Cookie写入到客户端硬盘文件中。
可以通过下面的方法设置有效时长
public void setMaxAge(int expiry)
其中expiry的单位为秒,整型。
大于 0,则表示要将 Cookie 写入到硬盘文件中;
小于 0,则表示 Cookie 存放在浏览器缓存中,与不设置时长等效;
等于 0,则表示 Cookie产生后直接失效。
package com.monkey1024.servlet;
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的失效时间
*
*/
public class CookieTest03 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie
Cookie cookie1 = new Cookie("username","monkey1024");
Cookie cookie2 = new Cookie("password","123456");
//手动设置绑定路径
cookie1.setPath("/aaa");
cookie2.setPath("/aaa");
//设置cookie的失效时间
cookie1.setMaxAge(60 * 60);//一小时
cookie2.setMaxAge(60 * 60 * 24);//一天
//将Cookie添加到相应中
response.addCookie(cookie1);
response.addCookie(cookie2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
服务器端获取请求的cookie
在 HttpServletRequest 中有一个方法getCookies(),专门用于读取请求中所携带的 Cookie 数据,该方法的返回值类型是Cookie数组。
package com.monkey1024.servlet;
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
*
*/
public class CookieReceive extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookie = request.getCookies();
for(Cookie c : cookie){
System.out.println("name="+c.getName());
System.out.println("value="+c.getValue());
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}