HTTP Cookie
三、Cookie
* cookie实现原理:
基于响应头set-cookie和请求头cookie实现
* cookie的特点:
数据存放在客户端浏览器
浏览器对单个cookie有大小限制(4k) 同一个域名下有个数限制(20个)
1:设置cookie
涉及的知识点:
cookie的编码 解码、时效设置、共享域以及安全
String ck_value = "你好 cookie";
//tomcat8开始支持中文 但不支持空格,需要进行url转码
ck_value = URLEncoder.encode(ck_value,"utf-8");
System.out.println("编码后="+ck_value);
//获取cookie对象,可以获取多个,如果存在 value会覆盖
Cookie ck = new Cookie("msg",ck_value);
Cookie ck1 = new Cookie("msg1",ck_value);
/*设置cookie保存时效
负数:默认为当浏览器关闭时 cookie时效
整数:持久化存储,保存到硬盘,到时间后 自动时效 单位s
0:删除cookie
*/
ck.setMaxAge(60 * 60 * 24);//一天
/*
* cookie共享
* 1:setPath 同一域名内所有网页可以拿到
* 2:setDomain 表示126net.cn域名下可以拿到
* */
ck.setPath("/");//一般都要设置一下
ck.setDomain("126net.cn");
/* cookie安全*/
//不能被js获取到,无法用document.cookie打出cookie的内容
ck.setHttpOnly(true);
//传输加密 那么这个cookie只能用https协议发送给服务器
//ck.setSecure(true);
//响应到客户端
response.addCookie(ck);
response.addCookie(ck1);
2:获取cookie
获取的是cookie数组
//通过request获取cookie组
Cookie[] cookies = request.getCookies();
//判断cookie组是否有数据
if(cookies != null && cookies.length > 0 ){
//增强for循环,遍历数组
for(Cookie cookie : cookies){
//得到cookie的名字
String ck_name = cookie.getName();
if("msg".equals(ck_name)){
//cookie解码
String ck_value = URLDecoder.decode(cookie.getValue(),"utf-8");
System.out.println(ck_value);
break;
}
}
}
3:案例:最后一次登录时间的显示
package com.applesnt.httpcookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 第一访问:返回你好 欢迎您
* 第二次访问:你好 最后一次登录时间:2020年3月2日 14:34:30
*/
@WebServlet("/testcookie")
public class TestCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
boolean flag = false; //标识符,lastTime存在标识为true
//设置响应编码
response.setContentType("text/html;charset=utf-8");
//request获取浏览器cookie
Cookie[] cookies = request.getCookies();
//判断cookie是否为空
if(cookies!=null && cookies.length>0){
//遍历cookies
for(Cookie cookie : cookies){
//得到cookie的名称
String ck_name = cookie.getName();
//判断lastTime最后一次登录时间 是否存在
if("lastTime".equals(ck_name)){
flag = true;
//获取当前时间,重新set到cookie
Date date = new Date();
//格式化时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = simpleDateFormat.format(date);
//编码
str_date = URLEncoder.encode(str_date,"utf-8");
//把当前时间重新放到cookie中
cookie.setValue(str_date);
//设置cookie时效时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一月
//响应到浏览器
response.addCookie(cookie);
//得到lastTime的cookie value
String ck_value = cookie.getValue();
//解码
ck_value = URLDecoder.decode(ck_value,"utf-8");
//响应到页面
response.getWriter().write("<h1>欢迎回来,你最后一次登录时间:"+ck_value+"</h1>");
break;
}
}
}
if(cookies==null || cookies.length==0 || flag == false){
Date date = new Date();
//格式化时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = simpleDateFormat.format(date);
//编码
str_date = URLEncoder.encode(str_date,"utf-8");
//创建一个cookie
Cookie cookie = new Cookie("lastTime",str_date);
//设置cookie时效时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一月
//响应到浏览器
response.addCookie(cookie);
//响应到页面
response.getWriter().write("<h1>欢迎回来</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}