客户端会话跟踪技术Cookie
Cookie:是客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
- Cookie的基本使用:
1.创建Cookie对象,设置数据
Cookie cookie = new Cookie("key","value");
2.发送Cookie到客户端:使用response对象
response.addCookie(cookie);
3.使用request对象获取客户端携带的所有Cookie
Cookie[] cookies = request.getCookies();
4.遍历数组,调用Cookie对象方法,获取需要的Cookie对象
for (Cookie cookie : cookies) {
String name = cookie.getName();
if(name.equals("username")){
String value = cookie.getValue();
System.out.println(name+":"+value);
break;
}
}
- Cookie原理
Cookie的实现是基于HTTP协议的
响应头:set-cookie
请求头:cookie
访问aServlet,响应头中带有set-cookie:
访问bServlet,请求头中带有响应头传过来的cookie:
Cookie存活时间:
1、默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁。
2、setMaxAge(int seconds):设置Cookie存活时间
①正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除。
②负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁。
③零:删除对应的Cookie。
//设置存活时间 ,1周 7天
cookie.setMaxAge(60*60*24*7);
Cookie存储中文
Cookie 不能直接存储中文,如果需要存中文,则要进行转码:URL编码
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
//1.创建Cookie对象
String value = "张三";
//URL编码
value = URLEncoder.encode(value,"UTF-8");
System.out.println("存储数据:"+value);
//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
Cookie cookie = new Cookie("username",value);
//设置存活时间 ,1周 7天
cookie.setMaxAge(60*60*24*7);
//2.发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
//1.获取Cookie数组
Cookie[] cookies = request.getCookies();
//2.遍历数组
for (Cookie cookie : cookies) {
//3.获取数据
String name = cookie.getName();
if(name.equals("username")){
String value = cookie.getValue();
//URL解码
value = URLDecoder.decode(value,"UTF-8");
System.out.println(name+":"+value);//value解码后为 张三
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}