当前位置:网站首页>18.客户端会话技术Cookie
18.客户端会话技术Cookie
2022-07-30 19:54:00 【学习java的张三】
目录
一、会话技术(Cookie和Session)
会话:一次会话中包含多次请求和响应,
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
功能:在一次会话的范围内的多次请求建立连接,共享数据
客户端会话技术Cookie和服务器端会话技术Session
二、客户端会话技术Cookie
客户端会话技术,将数据保存到客户端
1.Cookie的实现原理
客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie
的响应头,客户端会根据这个响应头存储Cookie
信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie
请求头,而服务器会根据这个请求头进行用户身份、状态等较验。
2.Cookie使用步骤
先创建Cookie对象,绑定数据
new Cookie(String name, String value)
发送Cookie对象
resp.addCookie(Cookie cookie)
获取Cookie对象,拿到数据
Cookie[] cookie = req.getCookie()
@WebServlet("/only-set-cookie")
public class OnlySetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie1 = new Cookie("first-name", "first-pwd");
// 发送Cookie对象
resp.addCookie(cookie1);
// 创建Cookie对象
Cookie cookie2 = new Cookie("second-name", "second-pwd");
// 发送Cookie对象
resp.addCookie(cookie2);
}
}
}
@WebServlet("/only-get-cookie")
public class OnlyGetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Cookie对象
Cookie[] cookies = req.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
}
}
}
先在浏览器访问/only-set-cookie,再访问/only-get-cookie
当访问/only-set-cookie时,由于是第一次访问,请求头是不带参数的,但是响应头中有set-Cookie
当访问/only-get-cookie时请求头中有Cookie
3.Cookie的特点
(1)Cookie存储数据在客户端浏览器
(2)浏览器对于单个Cookie的大小有一定的限制(4kb),对于同一个域名下的总Cookie数量有限制(20个)
(3)一次可以创建多个Cookie对象,使用response多次调用addCookie方法发送Cookie即可
3.1Cookie可以创建几个对象?
一次可以创建多个Cookie对象,使用response多次调用addCookie方法发送Cookie即可
3.2Cookie的存活时间?
默认情况下,当浏览器关闭后,Cookie数据被销毁。但是如果想要持久化存储可以调用setMaxAge(int second)方法设置时间,时间到后,Cookie文件会自动失效。
- maxAge设置正数:将Cookie数据写入硬盘文件中,设置Cookie的存活时间
- maxAge设置正数:表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为-1
- maxAge设置为0:表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除
3.3Cookie存取中文?
有时候使用Cookie存取中文会出现乱码的问题,这时候在存取Cookie时需要使用URL编码进行一个编码和解码
编码:String value = URLEncoder.encode("张三", "utf-8");
解码:URLDecoder.decode(cookie.getValue(), "UTF-8");
@WebServlet("/demo")
public class Demo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie对象
String value = URLEncoder.encode("张三", "utf-8");
Cookie cookie1 = new Cookie("name", value);
// 发送Cookie对象
resp.addCookie(cookie1);
}
}
@WebServlet("/Get")
public class Get extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Cookie对象
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + URLDecoder.decode(cookie.getValue(), "UTF-8"));
}
}
}
在请求头和响应头中看到的是编码之后的内容
在IDEA中打印出来的信息
3.4Cookie的共享问题
当使用同一个tomcat启动两个Web项目时,怎么让两个项目获取到的Cookie进行共享
demo1下的Set和Get,demo1下的Cookie是first-name first-pwd
@WebServlet("/Set")
public class Set extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie = new Cookie("first-name", "first-pwd");
// 发送Cookie对象
resp.addCookie(cookie);
}
}
@WebServlet("/Get")
public class Get extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Cookie对象
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " " +cookie.getValue());
}
}
}
demo2下的Set和Get ,demo2下的Cookie是Second-name Second-pwd
@WebServlet("/set")
public class Set extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie = new Cookie("second-name", "second-pwd");
// 发送Cookie对象
resp.addCookie(cookie);
}
}
@WebServlet("/get")
public class Get extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Cookie对象
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " " + cookie.getValue());
}
}
}
先访问/demo1/Set和 /demo1/Get
先访问/demo2/set和 /demo2/get
说明两个项目中获取到的Cookie是不一样的,如果想从demo2中获取到demo1中的Cookie,可以使用cookie.setPath("/");
cookie.setPath("/");
demo1中的Set类
@WebServlet("/Set")
public class Set extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie = new Cookie("first-name", "first-pwd");
// 发送Cookie对象
cookie.setPath("/");
resp.addCookie(cookie);
}
}
先从demo1中获取到Cookie
再从demo2中获取到Cookie,这样就可以实现Cookie的共享
如果是不同的两个tomcat,怎么让两个项目获取到的Cookie进行共享,使用cookie.setDomain()方法,这个参数必须以“.”开始。 输入url访问的时候,必须输入域名才能解析。如果使用 cookie.setDomain(".new.com");,在另外一个电脑上输入http://home.new.com:8080/就可以获得Cookie,如果输入http://localhost:8080/就不能获得Cookie
cookie.setDomain(".new.com");
4.Cookie的作用
(1)Cookie一般用于存储少量的不太敏感的数据
(2)可以在不登陆的情况下,完成服务器对客户端的身份识别
5.使用Cookie实现记录上一次登录的访问时间
1.访问一个Servlet,如果是第一次访问,提示:欢迎您首次访问
2.如果不是第一次访问,提示:欢迎回来,上次访问时间是:显示字符串
在服务器中的Servlet判断是否存在一个lastTime的Cookie
第一次访问-----提示:欢迎您首次访问,写回Cookie
不是第一次访问-----提示:欢迎回来,写回Cookie
package cn;
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;
@WebServlet("/lastTimeCookie")
public class LastTimeCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
// 1.先获取所有的Cookie
Cookie[] cookies = req.getCookies();
if(cookies == null || cookies.length == 0){
// 第一次访问
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
// 因为time中间有个空格,要进行URL编码解码
time = URLEncoder.encode(time, "utf-8");
Cookie cookie = new Cookie("lastTime",time);
// 设置Cookie的存活时间,一个月
cookie.setMaxAge(60 *60 *24 *30);
resp.addCookie(cookie);
resp.getWriter().write("欢迎您首次访问");
}
if(cookies != null){
for(Cookie cookie: cookies){
String name = cookie.getName();
if(name.equals("lastTime")){
// 获取当前时间,重新设置Cookie值
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
// 因为time中间有个空格,要进行URL编码解码
time = URLEncoder.encode(time, "utf-8");
cookie.setValue(time);
// 设置Cookie的存活时间,一个月
cookie.setMaxAge(60 *60 *24 *30);
resp.addCookie(cookie);
String value = URLDecoder.decode(cookie.getValue(), "utf-8");
resp.getWriter().write("欢迎回来,上次访问时间是" + value);
break;
}
}
}
}
}
首次访问
第二次访问
边栏推荐
猜你喜欢
LeetCode 0952.按公因数计算最大组件大小:建图 / 并查集
推荐系统:实时性【特征实时性:客户端实时特征(秒级,实时)、流处理平台(分钟级,近实时)、分布式批处理平台(小时/天级,非实时)】【模型实时性:在线学习、增量更新、全量更新】
VBA runtime error '-2147217900 (80040e14): Automation error
After MySQL grouping, take the largest piece of data [optimal solution]
[hbuilder] cannot run some projects, open the terminal and cannot enter commands
推荐系统:评估指标【离线评估指标:RMSE(均方根误差)、AUC、准确率、召回率、F1】【在线评估:A/B测试】【一般要求响应时间<0.5s】
【MindSpore】用coco2017训练Model_zoo上的 yolov4,迭代了两千多batch_size之后报错,大佬们帮忙看看。
Interviewer Ali: Describe to me the phenomenon of cache breakdown, and talk about your solution?
The JDBC programming of the MySQL database
MindSpore:【MindSpore1.1】Mindspore安装后验证出现cudaSetDevice failed错误
随机推荐
ERROR 1045 (28000) Access denied for user 'root'@'localhost'Solution
从离线到实时对客,湖仓一体释放全量数据价值
Install MySQL tutorial under Linux
【MindSpore】多卡训练保存权重问题
iPhone真是十三香?两代产品完全对比,或许上一代更值得买
Start background services across processes
[Private Series] All kinds of strange problems encountered in daily PHP
基于人脸的常见表情识别——模型搭建、训练与测试
推荐系统-模型:FNN模型(FM+MLP=FNN)
Win11如何更改默认下载路径?Win11更改默认下载路径的方法
多线程的互斥锁应用RAII机制
MySQL kills 10 questions, how many questions can you stick to?
Maxwell 一款简单易上手的实时抓取Mysql数据的软件
【PyTorchVideo教程01】快速实现视频动作识别
linux下mysql8安装
基于人脸的常见表情识别(1)——深度学习基础知识
ImportError: attempted relative import with no known parent package
PHP低代码开发引擎—表单设计
After watching "Second Uncle", I was even more internalized
阿里面试官:给我描述一下缓存击穿的现象,并说说你的解决思路?