目录
1 会话技术概述
2 客户端会话技术Cookie
2.1 快速入门
2.2 实现原理分析
2.3 Cookie使用细节
2.3 Cookie的特点及作用
3 Cookie案例实战
会话与生活中的谈话很类似,有开始,有结束,中间过程一问一答。一次会话中包含多次请求和响应:
Cookie是将数据保存到客户端的一种客户端会话技术,比如,上节中提到的京东购物,点击一次加入一次购物车,这是一次请求,浏览器就会将获取的数据保存在本地。
使用步骤如下:
【举例】:写两个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);
}
}
Cookie实质上就是基于响应头set-cookie和请求头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在浏览器的保存时长?
//1、创建Cookie对象
Cookie c = new Cookie("msg","setMaxAge");
c.setMaxAge(30); //cookie持久化存储30s后自动删除
//2、发送Cookie
response.addCookie(c);
3、cookie能不能存储中文?
4、cookie的共享问题?
1)假设在同一个Tomcat服务器中部署 了多个web项目,那么这些web项目的cookie能否共享?
2)不同的Tomcat服务器间的共享问题
setDomain(String path):设置一级域名相同,那么多个服务器之间的cookie就可以共享了,比如:setDomain(".baidu.com"),则tieba.baidu.com中的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("欢迎回来,您上次访问时间为:"+value+"
");
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("您好,欢迎您首次访问
");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
———————————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有些许帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!