目录
1 会话技术概述
会话与生活中的谈话很类似,有开始,有结束,中间过程一问一答。一次会话中包含多次请求和响应:
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,知道有一方断开;
- 功能:在一次会话的范围内的多次请求间来共享数据(比如:京东点击多个加入购物车,然后去购物车结算就用到了);
- 方式:1)客户端会话技术Cookie;
2)服务器端会话技术Session;
2 客户端会话技术Cookie
Cookie是将数据保存到客户端的一种客户端会话技术,比如,上节中提到的京东购物,点击一次加入一次购物车,这是一次请求,浏览器就会将获取的数据保存在本地。
2.1 快速入门
使用步骤如下:
- 1)创建Cookie对象,绑定数据:new Cookie(String name, String value)
- 2)发送Cookie对象:response.addCookie(Cookie cookie)
- 3)获取Cookie,来拿到数据:Cookie[] request.getCookies()
【举例】:写两个Servlet,代码如下,测试时,先打开浏览器分别访问Demo1和Demo2,我们可以看到后台打印出Cookie数据,但是关闭浏览器,再次访问Demo2,就不能获取到数据了。
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、创建Cookie对象
Cookie c = new Cookie("msg","hello");
//2、发送Cookie
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3、获取Cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.2 实现原理分析
Cookie实质上就是基于响应头set-cookie和请求头cookie实现的。
2.3 Cookie使用细节
cookie的使用涉及几个细节问题:
1、一次是否可以发送多个cookie?
可以,创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
@WebServlet("/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、创建Cookie对象
Cookie c1 = new Cookie("msg","hello");
Cookie c2 = new Cookie("name","world");
//2、发送Cookie
response.addCookie(c1);
response.addCookie(c2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2、cookie在浏览器的保存时长?
- 默认情况下,当浏览器关闭后Cookie数据被销毁;
- 可以设置cookie,使其持久化存储,setMaxAge(int seconds),参数为:
正数:将Cookie数据写到硬盘文件中,数值大小表示了cookie存活时间;
负数:默认值;
零:删除Cookie数据;
//1、创建Cookie对象
Cookie c = new Cookie("msg","setMaxAge");
c.setMaxAge(30); //cookie持久化存储30s后自动删除
//2、发送Cookie
response.addCookie(c);
3、cookie能不能存储中文?
- Tomcat8之前,cookie中不能存储中文数据,会报错,在Tomcat8之后,cookie支持中文数据,但对于特殊还是不支持,建议使用URL编码存储,使用URL解码解析;
- 若是Tomcat8之前的,需要将中文数据转码,一般采用URL编码(%E3这种格式)
4、cookie的共享问题?
1)假设在同一个Tomcat服务器中部署 了多个web项目,那么这些web项目的cookie能否共享?
- 默认情况下是不能共享的;
- 通过setPah(String path)可以设置cookie的获取范围,默认情况下是当前的虚拟目录,若要共享,可设置为“/”;
2)不同的Tomcat服务器间的共享问题
setDomain(String path):设置一级域名相同,那么多个服务器之间的cookie就可以共享了,比如:setDomain(".baidu.com"),则tieba.baidu.com中的cookie就可以共享了。
2.3 Cookie的特点及作用
【特点】:
- cookie存储数据在客户端浏览器
- 浏览器对于单个cookie的大小有限制,且对同一域名下的总cookie数量也有限制(20个)
【作用】:
- cookie一般用于存储少量的不太敏感的数据;
- 在不登录的情况下来完成服务器对客户端的身份识别(如不登录百度账号,设置百度,下次再次打开百度首页后设置仍有效);
3 Cookie案例实战
【案例】:记住上一次的访问时间
【需求】:访问一个servlet,若是第一次访问,则提示:您好,欢迎您首次访问;若不是,则提示:欢迎回来,您上次访问时间为:显示时间字符串。
【分析】:
【代码实现】:如下,注意Cookie有特殊字符时需要进行URL编解码,否则会报错
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1、判断Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;
if(cookies!= null && cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("lastTime".equals(name)){
flag = true;
//设置Cookie,时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
time = URLEncoder.encode(time,"utf-8"); //URL编码,否则会报错
cookie.setValue(time);
//设置存活时间
cookie.setMaxAge(60*60*24*30);//一个月
response.addCookie(cookie);
//响应数据
String value = cookie.getValue();
value = URLDecoder.decode(value,"utf-8");
response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
break;
}
}
}
if(cookies ==null || cookies.length==0 || flag==false){
//设置Cookie,时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
time = URLEncoder.encode(time,"utf-8");
Cookie cookie = new Cookie("lastTime",time);
//设置存活时间
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);
}
}
———————————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有些许帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!