会话技术Cookie详细,主要内容:1. 会话技术;2. 会话技术之Cookie
本文目录
一.会话技术
1.会话概念
会话:一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开(客户端浏览器关闭或者服务器关闭)为止。
2.会话功能
在一次会话的范围内的多次请求间,可以共享数据。
3.会话方式
- 客户端会话技术:
Cookie
- 服务器端会话技术:
Session
二.Cookie
1.Cookie概念
Cookie是客户端会话技术,可以将数据保存到客户端。
2.Cookie快速入门
Cookie使用步骤:
- 服务器创建Cookie对象,绑定数据
– 代码new Cookie(String name, String value)
;创建Cookie对象,参数以键值对形式保存数据。 - 向浏览器发送Cookie对象
– 代码response.addCookie(Cookie cookie)
;发送对象,参数是Cookie对象。 - 服务器获取Cookie,拿到数据
– Request对象的方法Cookie[] getCookies();
,返回Cookie对象数组,本次会话中浏览器存储的所有Cookie对象。
代码演示:
- CookieDemo1创建Cookie对象
- CookieDemo2获取Cookie对象
@WebServlet(name = "CookieDemo1", urlPatterns = "/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.创建Cookie对象
Cookie cookie = new Cookie("msg", "hello");
//2.向客户端发送Cookie
response.addCookie(cookie);
}
}
@WebServlet(name = "CookieDemo2", urlPatterns = "/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//3.获取Cookie
Cookie[] cookies = request.getCookies();
//获取数据,遍历Cookie数组
if (cookies != null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+":"+value);
}
}
}
}
运行服务器,访问CookieDemo1:
打开浏览器控制台,查看响应头:
再访问CookieDemo2:
打开浏览器控制台,查看请求头:
控制台打印Cookie对象信息:
3.Cookie实现原理
是基于响应头Set-Cookie和请求头Cookie实现。
- 创建Cookie是发送给浏览器,是在响应消息中添加了Set-Cookie响应头,值是创建Cookie对象所设置的参数。
- 使用Cookie是浏览器每次请求,在请求消息中会添加Cookie的请求头,值是会话中的所有Cookie对象。
4.Cookie的细节
4.1 一次可不可以发送多个cookie?
可以创建多个Cookie对象,使用response调用多次addCookie();
方法发送cookie即可。
代码演示:
![Demo2.2](D:\文档存储\JAVA\技术路线\阶段2 JavaWeb+黑马旅游网\08-Cookie和Session\笔记图\Cookie\Demo2.2.png)@WebServlet(name = "CookieDemo3", urlPatterns = "/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.创建Cookie对象
Cookie cookie1 = new Cookie("msg", "hello");
Cookie cookie2 = new Cookie("name", "zhangsan");
//2.发送Cookie
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
访问CookieDemo3,响应消息头中会有多个Set-Cookie
头
打开浏览器控制台,查看响应头:
4.2 cookie在浏览器中保存多长时间?
默认情况下,当浏览器关闭后,Cookie数据被销毁。我们也可以持久化存储:
void setMaxAge(int seconds);
设置Cookie存活时间。参数以秒为单位。
参数seconds:- 正数:将Cookie数据写到硬盘的文件中。持久化存储,并指定cookie存活时间,不随浏览器关闭而消亡,时间到后,cookie文件自动失效。
- 负数:默认情况
- 零:删除该Cookie对象信息
Cookie持久化存储的位置
谷歌Chrome的Cookie数据位于:%LOCALAPPDATA%\Google\Chrome\User Data\Default\ 目录中,名为Cookies的文件中。
如:C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\Cookies
4.3 cookie能不能存中文
在tomcat 8 之前 Cookie中不能直接存储中文数据。需要将中文数据转码,一般采用URL编码(比如:%E3)。
JDK为我们提供的URL编码的URLEncoder类,有编码的静态方法,直接调用即可:
public static String encode(String s, String enc);
将字符串URL编码,返回完成编码的字符串。
参数:String s(需要编码字符串),String enc (字符串的字符集,常用UTF-8)
JDK为我们提供的URL解码的URLDecoder类,有解码的静态方法,直接调用即可:
public static String decode(String s, String enc);
将字符串URL解码,返回完成解码的字符串。
参数:String s(需要解码字符串),String enc (字符串的字符集,常用UTF-8)
在tomcat 8 之后,Cookie支持中文数据。特殊字符还是不支持,比如空格。所有Cookie存储特殊数据的时候,建议使用URL编码存储,获取数据后,URL解码解析再使用数据。
String date = "yyyy年MM月dd日 HH:mm:ss";
String En_str = "";
String De_str = "";
//URL编码
En_str = URLEncoder.encode(date,"utf-8");
//URL解码:
De_str = URLDecoder.decode(En_str,"utf-8");
4.4 cookie共享问题?
1.假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
默认情况下cookie不能共享。需要设置Cookie共享域,Cookie对象可以调用以下方法来设置cookie的获取范围:
void setPath(String path)
:设置cookie的获取范围。默认情况下,当前的虚拟目录才能共享。
如果要共享,则可以将path设置为"/"
,表示同一个服务器下所有Web项目都可以共享。
2.不同的tomcat服务器间cookie共享问题?
默认情况下cookie不能共享。Cookie对象可以调用以下方法来设置不同服务器间cookie共享:
void setDomain(String path)
:如果设置一级域名相同,那么多个服务器之间cookie可以共享
setDomain(".baidu.com")//那么tieba.baidu.com和news.baidu.com中cookie可以共享
baidu.com 一级域名
tieba、news二级域名
5.Cookie的特点和作用
特点:
- cookie存储数据在客户端浏览器
- 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个),不同浏览器可能不同。
作用:
- cookie一般用于存出少量的不太敏感的数据
- 在不登录的情况下,完成服务器对客户端的身份识别,将客户端临时的一些信息直接存储再cookie中。
6.案例:记录上一次访问的时间
6.1 需求:
- 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
- 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
6.2 分析:
- 可以采用Cookie来完成
- 在服务器的Servlet中判断是否有一个名为lastTime的cookie
- 有:不是第一次访问
- 则响应数据:欢迎回来,您上次访问时间为:2020年08月22日 14:52:43
- 并且写回Cookie:lastTime=2020年08月22日 14:52:43
- 没有:是第一次访问
- 响应数据:您好,欢迎您首次访问
- 创建Cookie:lastTime=2020年08月22日 14:50:56
- 有:不是第一次访问
6.3 代码实现
CookieTest.java
@WebServlet(name = "CookieTest", urlPatterns = "/CookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置响应的消息体的数据格式以及编码
response.setContentType("text/html;charset=utf-8");
//1.获取所有的Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;//标志,false没有名称为lastTime的Cookie
//2.遍历cookies数组
if (cookies!=null&&cookies.length>0){
for (Cookie cookie : cookies) {
//3.获取cookie的名称
String name = cookie.getName();
//4.判断名称是否是:lastTime
if ("lastTime".equals(name)){
//存在该Cookie,说明不是第一次访问
flag = true;//有lastTime的cookie
//5.更新Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送Cookie
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = format.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
cookie.setValue(str_date);
//设置Cookie的存活时间
cookie.setMaxAge(60*60*24);//一天
//6.发送Cookie
response.addCookie(cookie);
//获取上一次访问的时间
//7.获取Cookie的value,时间
String value = cookie.getValue();
System.out.println("解码前:"+value);
//URL解码:
value = URLDecoder.decode(value,"utf-8");
System.out.println("解码后:"+value);
response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
break;
}
}
}
//第一次访问
if (cookies==null||cookies.length==0||flag==false){
//没有名称为lastTime的Cookie
//获取当前时间的字符串,设置Cookie的值,发送Cookie
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = format.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
//1.创建Cookie对象
Cookie cookie = new Cookie("lastTime", str_date);
//2.设置Cookie存活s时间
cookie.setMaxAge(60*60*24);
//3.发送Cookie
response.addCookie(cookie);
response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
}
}
}
6.4 运行
第一次访问CookieTest
控制台打印
响应的Cookie信息
第二次访问CookieTest
控制台打印
到这完成了使用Cookie技术记录上一次访问的时间案例。
推荐阅读:
1.会话技术Cookie详细.
2.Cookie共享问题.
3.会话技术Session详细.
4.Cookie和Session简单应用情景.
欢迎点赞评论,指出不足,笔者由衷感谢哦!~