前言:
我们平时登陆网页,如果有浏览记录的话,可以不用输入账号账户密码,直接登陆。有没有想过这个原理?
其实就是 浏览器第一次浏览服务器后,服务器会返回给浏览器一个饼干
象征标识浏览器,下次再当浏览器拿着饼干再次浏览该服务器时,
服务器就认识这个浏览器了 无需认证,直接登陆。
总结:会话数据保存在浏览器客户端
,即Cookie中
但是注意:
Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie
但是浏览器一般只允许存放300个Cookie,
每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
1)构造Cookie对象
Cookie(String name,String value)
2)设置cookie //默认当前项目
void setPath(String uri) :设置cookie的有效访问路径
void setMaxAge(int expiry) : 设置cookie的有效时间
void setValue(String newValue) :设置cookie的值
3)发送cookie到浏览器端保存
void response.addCookie(Cookie cookie) : 发送cookie
4)服务器接收cookie
Cookie[] request.getCookies() : 接收cookie
流程:
1)服务器创建cookie对象,把会话数据存储到cookie对象中。
2) 服务器发送cookie信息到浏览器
举例: set-cookie: name=eric (隐藏发送了一个set-cookie名称的响应头)
3)浏览器得到服务器发送的cookie,然后保存在浏览器端。
4)浏览器在下次访问服务器时,会带着cookie信息
举例: cookie: name=eric (隐藏带着一个叫cookie名称的请求头)
5)服务器接收到浏览器带来的cookie信息
request.getCookies();
举例:
Cookie cookie1=new Cookie("name", "1");
cookie1.setMaxAge(4); // 数值表示保存的时间 标识4秒内如果浏览器没有再次访问服务器,那么就删除Cookie
//cookie1.setMaxAge(-1); //负数就行随意 默认是浏览器关闭后就清除
//cookie1.setMaxAge(0); //删除同名的cookie数据这里是cookie1
Cookie cookie2=new Cookie("name", "2"); //同名了
Cookie cookie3=new Cookie("name", "3");
//cookie1.setPath("/saa/xx"); //设置Cookie有效路径,一般都是默认项目
//cookie3.setPath("/day12");
response.addCookie(cookie1);
response.addCookie(cookie3);
response.addCookie(cookie2); //响应头是三个都发过去,但是实际上浏览器存储的是最后一个name
Cookie[] cookies=request.getCookies();
if(cookies!=null) //浏览器存储着Cookie
{
for(Cookie cookiex:cookies) {
String name=cookiex.getName();
String value=cookiex.getValue();
System.out.println(name+" "+value);
}
}else {
System.out.println("No");
}
有人会问如何查看Cookie呢?
url框的最左边位置感叹号可以点,然后
即可查看 还可以删除
案例:保存最近一次访问的时间,显示这一次访问的时间:
response.setContentType("text/html;charset=utf-8");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time=format.format(new Date());
System.out.println(time);
Cookie[] cookies=request.getCookies();
if(cookies!=null) {
for(Cookie cookieone:cookies) {
if("lastTime".equals(cookieone.getName())) {
String lastTime=cookieone.getValue();
cookieone.setValue(time);
cookieone.setMaxAge(1*30*24*60*60);
response.addCookie(cookieone);
response.getWriter().write("上一次访问时间是:"+lastTime+"这一次访问时间是"+time);
}
}
}else {
System.out.println("第一次访问");
Cookie cookie=new Cookie("lastTime", time);
cookie.setMaxAge(1*30*24*60*60);//保存一个月
response.addCookie(cookie);
response.getWriter().write(time);
}
但是会报错:
An invalid character [32] was present in the Cookie value
原因:
一个不识别的字符[32]出现在了cookie当中
由于tomcat的版本比较高,所以在addCookie时是不能使用空格的 而在ASCII码中32对应的就是空格。
解决方案:
只要把后台代码中的空格删掉就可以了。
即删掉 “yyyy-MM-dd hh:mm:ss” 空格 或者改为”-“