Web-7-深入理解Cookie与Session:实现用户跟踪和数据存储
深入理解Cookie与Session:实现用户跟踪和数据存储
今日目标
1.掌握客户端会话跟踪技术Cookie
2.掌握服务端会话跟踪技术Sesssion
1.会话跟踪技术介绍
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。一次会话中可以包含多次请求和响应.

HTTP协议是无状态协议,每次同一浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现同一会话内数据共享
思考:下图建立几个会话?

每个浏览器都会与服务端建立了一个会话,加起来总共是3个会话。
思考:服务器如何识别多次请求是否来自于同一浏览器?
这就需要我们学习今天的内容,会话跟踪技术。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
原因:HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享
思考:一个会话中的多次请求为什么要共享数据呢?有了这个数据共享功能后能实现哪些功能呢?
购物车功能:
加入购物车和去购物车结算是两次请求,但是后面这次请求要想展示前一次请求所添加的商品,就需要用到数据共享。记住我功能:当用户登录成功后,勾选
记住我按钮后下次再登录的时候,网站就会自动填充用户名和密码,简化用户的登录操作,多次登录就会有多次请求,他们之间也涉及到共享数据
实现方式:
-
客户端会话跟踪技术:Cookie
-
服务端会话跟踪技术:Session
2.Cookie基本使用
Cookie:客户端会话跟踪技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
2.1基本使用

2.1.1 发送Cookie
-
创建Cookie对象,设置数据
Cookie cookie = new Cookie("key","value");
-
发送Cookie到客户端:使用response对象
response.addCookie(cookie);
2.1.2获取Cookie
-
获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
-
遍历数组,获取每一个Cookie对象:for
-
使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
2.2代码实现
-
创建08_Cookie_Session的Maven Web项目,并添加Servlet依赖在Pom.xml中
<dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency></dependencies>
Cookie[] cookies = request.getCookies();
-
创建AServlet用于发送Cookie到浏览器
package com.zbbmeta.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
/*** 发送Cookie*/
@WebServlet(value = "/a")
public class Aservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.创建cookie对象Cookie cookie = new Cookie("name","lisi");//2.发送cookie对象到浏览器response.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
-
创建BServlet用于获取Cookie数据
package com.zbbmeta.cookie;
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.io.PrintWriter;/*** 获取Cookie*/
@WebServlet(value = "/b")
public class Bservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//3.获取客户端携带的所有Cookie,使用request对象Cookie[] cookies = request.getCookies();response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();if(cookies!=null){//4.遍历数组,获取每一个Cookie对象:forfor (Cookie cookie : cookies) {//5.使用Cookie对象方法获取数据String name = cookie.getName();String value = cookie.getValue();writer.write(name+" = "+value+"<br>");}}else {writer.write("cookie不存在<br>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
-
在浏览器中先访问地址:
http://localhost:8080/cookie-session/a,然后在访问http://localhost:8080/cookie-session/b查看浏览器结果,如图所示:

3Cookie原理
Cookie的实现是基于HTTP协议的
-
响应头:set-cookie
-
请求头:cookie

在浏览器 查看Cookie

3.Cookie使用细节
3.1Cookie 存活时间
-
默认情况下,Cookie 存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
- setMaxAge(int seconds):设置Cookie存活时间,但是是秒
-
负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则 Cookie被销毁

-
正数:将 Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
-

-
零:立即过期,步骤和结果和正数步骤一致,这里就不掩饰了 完整代码:
-
AServlet
package com.zbbmeta.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
/*** 发送Cookie*/
@WebServlet(value = "/a")
public class Aservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.创建cookie对象Cookie cookie = new Cookie("name","lisi");//3. setMaxAge(int seconds):设置Cookie存活时间,但是是秒cookie.setMaxAge(10);
// cookie.setMaxAge(-1);//cookie.setMaxAge(0);//2.发送cookie对象到浏览器response.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
3.2Cookie 存储问题
- 如需要存储空格,则需要进行转码:URL编码
-
会出现问题
-

-
解决方法
-
在发送cookie端进行URL编码
URLEncoder.encode(name,"UTF-8");
-
在获取cookie端进行URL解码
value = URLDecoder.decode(name,"UTF-8");
-
浏览器显示结果

-
完整代码
-
AServlet
package com.zbbmeta.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;/*** 发送Cookie*/
@WebServlet(value = "/a")
public class Aservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.创建cookie对象String name = " lisi";name = URLEncoder.encode(name,"UTF-8");Cookie cookie = new Cookie("name",name);//3. setMaxAge(int seconds):设置Cookie存活时间,但是是秒cookie.setMaxAge(10);
// cookie.setMaxAge(-1);//cookie.setMaxAge(0);//2.发送cookie对象到浏览器response.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
-
BServlet
package com.zbbmeta.cookie;
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.io.PrintWriter;
import java.net.URLDecoder;/*** 获取Cookie*/
@WebServlet(value = "/b")
public class Bservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//3.获取客户端携带的所有Cookie,使用request对象Cookie[] cookies = request.getCookies();response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();if(cookies!=null){//4.遍历数组,获取每一个Cookie对象:forfor (Cookie cookie : cookies) {//5.使用Cookie对象方法获取数据String name = cookie.getName();String value = cookie.getValue();value = URLDecoder.decode(value,"UTF-8");writer.write(name+" = |"+value+"<br>");}}else {writer.write("cookie不存在<br>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
-
Tomcat7 Cookie 不能直接存储中文,Tomcat8 Cookie可以存储中文,但不能存储空格
4.Session基本使用
Session:服务端会话跟踪技术:将数据保存到服务端
4.1基本使用

4.1.1 获取Session
-
JavaEE 提供 HttpSession接口,来实现一次会话的多次请求间数据共享功能
-
使用:
-
获取Session对象
-
HttpSession session = request.getSession();
4.1.2 Session对象功能
-
Session对象功能:
void setAttribute(String name, Object o)//存储数据到 session 域中Object getAttribute(String name) //根据 key,获取值void removeAttribute(String name) //根据 key,删除该键值对
4.2代码实现
-
创建CServlet用于存储数据到Session对象
package com.zbbmeta.session;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;/*** 1.存储Session数据到服务器*/
@WebServlet(value = "/c")
public class CServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.获取Session对象HttpSession session = request.getSession();//2.存储数据到sessionsession.setAttribute("name","session_wangwu");response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("访问了C资源"+"<br>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
-
创建DServlet用于从Session对象获取数据
package com.zbbmeta.session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;/*** 2.在Session对象中获取数据*/
@WebServlet(value = "/d")
public class DServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//1.获取Session对象HttpSession session = request.getSession();//2.存储数据到sessionObject name = session.getAttribute("name");response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("访问了D资源"+"<br>");if(name!=null){writer.write(name.toString()+"<br>");}else {writer.write("Session数据不存在"+"<br>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
-
在浏览器中先访问地址:
http://localhost:8080/cookie-session/c,然后在访问http://localhost:8080/cookie-session/d查看浏览器结果,如图所示:

5.Session原理
Session基于Cookie实现

思考:如果新开一个浏览器,还是同一个session对象么?

答案:上图显示的获取的Session对象不是一个,每一个浏览器都会获取一个新的Session对象
- 判断Session对象是否是新对象代码
-
CServlet
-
package com.zbbmeta.session;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;/*** 1.存储Session数据到服务器*/
@WebServlet(value = "/c")
public class CServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();//1.获取Session对象HttpSession session = request.getSession();//3.判断Session是否是新对象boolean aNew = session.isNew();//4.获取SessionIDString id = session.getId();writer.write("session 是新的= "+aNew+" session id : "+id+"<br>");//2.存储数据到sessionsession.setAttribute("name","session_wangwu");writer.write("访问了C资源"+"<br>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
-
DServlet
package com.zbbmeta.session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;/*** 2.在Session对象中获取数据*/
@WebServlet(value = "/d")
public class DServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();//1.获取Session对象HttpSession session = request.getSession();//3.判断Session是否是新对象boolean aNew = session.isNew();//4.获取SessionIDString id = session.getId();writer.write("session 是新的= "+aNew+" session id : "+id+"<br>");//2.存储数据到sessionObject name = session.getAttribute("name");writer.write("访问了D资源"+"<br>");if(name!=null){writer.write(name.toString()+"<br>");}else {writer.write("Session数据不存在"+"<br>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
-
浏览器结果

6.Session使用细节
6.1.Session 钝化、活化
- Session 钝化、活化:
- 服务器重启后,Session中的数据是否还在?
-
钝化:在服务器正常关闭后, Tomcat自动将 Session数据写入硬盘的文件中
-
活化:再次启动服务器后,从文件中加载数据到Session中
-
- 服务器重启后,Session中的数据是否还在?
在IDEA中配置钝化

查看钝化数据
查看钝化数据的前台条件是,我们已经有Session对象存储数据
-
1.我们现在的08_Cookie_Session项目启动的,并且访问了c资源
-
2.关闭项目
-
3.根据路径查看session数据
-
4.发现有后缀为.ser的文件
-
5.重新启动.ser文件就不存在了(步骤五就是活化)



6.2.Seesion 销毁
6.2.1 默认情况下,无操作,30分钟自动销毁
-
获取存活时间方式
//5.获取存活时间int maxInactiveInterval = session.getMaxInactiveInterval();
-
访问c,浏览器结果

-
停留10s,访问d,浏览器结果

思考:为什么停留10s后,session对象的存活时间还是1800s?
存活时间表示的是没有访问资源的情况下,如果访问了,则存活时间重新变为1800s.
6.2.2 web.xml配置存活时间
可以通过web.xml进行配置,单位为分钟
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><session-config>
<!-- 单位是分钟--><session-timeout>2</session-timeout></session-config>
</web-app>

-
调用 Session对象的 invalidate()方法
注意:最好关闭浏览器再打开
6.1Cookie和Session的对比
- 相同点:
-
Cookie 和 Session 都是来完成一次会话内多次请求间数据共享的
-
- 区别
-
键值对数量:Cookie 存一个键和一个值,Session 存n个键和值
-
存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
-
安全性:Cookie 不安全,Session 安全
-
数据大小:Cookie 最大4KB,Session 无大小限制
-
存储时间:Cookie默认浏览器关闭,Session 默认30分钟
-
服务器性能:Cookie 不占服务器资源,Session 占用服务器资源
-
相关文章:
Web-7-深入理解Cookie与Session:实现用户跟踪和数据存储
深入理解Cookie与Session:实现用户跟踪和数据存储 今日目标 1.掌握客户端会话跟踪技术Cookie 2.掌握服务端会话跟踪技术Sesssion 1.会话跟踪技术介绍 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断…...
Springboot设置Https
1、修改配置文件application.yml,并将*.jks放到resource目录下。 server:port: 8080ssl:key-store: classpath:*.jkskey-store-password: *key-store-type: JKSenabled: truekey-alias: boe.com.cn2、添加http转https的配置 Configuration public class TomcatCon…...
Windows 使用 Linux 子系统,轻轻松松安装多个linux
Windows Subsystem for Linux WSL 简称WSL,是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机&#…...
中级课程——弱口令(认证崩溃)
文章目录 什么是弱口令密码生成器分类暴力破解万能密码测试环境工具 什么是弱口令 密码生成器 分类 暴力破解 万能密码 or true --测试环境 工具 九头蛇,超级弱口令爆破工具,bp,...
web自动化测试进阶篇05 ——— 界面交互场景测试
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…...
NICE-SLAM: Neural Implicit Scalable Encoding for SLAM论文阅读
论文信息 标题:NICE-SLAM: Neural Implicit Scalable Encoding for SLAM 作者:Zihan Zhu, Songyou Peng,Viktor Larsson — Zhejiang University 来源:CVPR 代码:https://pengsongyou.github.io/nice-slam…...
cmake 配置Visual studio的调试命令
配置代码如截图: set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_COMMAND "./consoleTest.exe") set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "./config/labelDriver.cfg") set_propert…...
MPDIoU: A Loss for Efficient and Accurate Bounding BoxRegression--论文学习笔记
超越GIoU/DIoU/CIoU/EIoU MPDIoU让YOLOv7和YOLACT双双涨点 目标检测上的指标对比: 论文地址: [2307.07662] MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression (arxiv.org) 摘要 边界框回归(Bounding Box Regression&am…...
【Uniapp 的APP热更新】
Uniapp 的APP热更新功能依赖于其打包工具 HBuilder,具体步骤如下: 1. 在 HBuilder 中构建并打包出应用程序 具体步骤: 1.点击发行,点击制作wgt包 2.根据需求修改文件储存路径和其他配置,点击确定 3.等待打包完成&a…...
MySQL主从复制配置
Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。 (1)首先确保主从服务器上的Mysql版本相同 (2)在主服务器上,创建一个充许从数据库来访问的用户slave,密码为:123456 ,然后使用REPLICATION SLAV…...
Linux - 添加普通用户为信任用户
1.添加用户 在Linux系统中,可以使用以下步骤添加用户: 打开终端并以root用户身份登录 输入以下命令以创建新用户(请将username替换为您想要创建的用户名): adduser username 设置该用户的密码,使用以下命…...
flask----路由系统
# 1 flask路由系统是基于装饰器的:参数如下 # 2 转换器: # 3 路由系统本质 # 4 endpoint 不传会怎么样,不传会以视图函数的名字作为值,但是如果加了装饰器,所有视图函数名字都是inner,就会出错,使用wrapp…...
驶向专业:嵌入式开发在自动驾驶中的学习之道
导语: 自动驾驶技术在汽车行业中的快速发展为嵌入式开发领域带来了巨大的机遇。作为自动驾驶的核心组成部分,嵌入式开发在驱动汽车的智能化和自主性方面发挥着至关重要的作用。本文将探讨嵌入式开发的学习方向、途径以及未来在自动驾驶领域中的展望。 一、学习方向:…...
Go语言入门:从零开始的快速指南(一)
文章目录 引言Go语言的诞生背景Go 语言的特性安装Go语言环境集成开发环境安装第一个Go程序Go 源代码的特征解读 引言 Go语言(也称为Golang)是一种开源的、静态类型的编程语言,由Google开发。它的设计目标是简单、高效、安全、并且易于学习和…...
Windows7+内网, 安装高版本nodejs,使用vite+vue3+typescript开发项目
前言:vite只支持高版本的nodejs,而高版本的nodejs只支持windows8及以上,且vite还对浏览器版本有兼容问题。以下均为vite官网截图 1、安装好低版本的nodejs win7系统建议安装13.及以下,我的是12.12.0这个版本。nodejs低版本官网下载…...
【C语言day14】
#include<stdio.h>int fun(char* s) {char* t s;while (*t);return(t - s); }int main() {char s[] "abc";int n fun(s);printf("%d\n", n);//4return 0; }循环在*t为0时停止,同时t,t最后会停在字符串结束的’\0’之后的一…...
暑假刷题第19天--8/1
170. 加成序列 - AcWing题库(dfs迭代加深--重点理解) #include<iostream> using namespace std; int n; int a[11]; int dfs(int x,int h){if(x>h1)return 0;if(a[x-1]n)return 1;bool st[130]{};for(int i1;i<x-1;i){for(int j1;j<i;j)…...
Java开发中的------修改密码+忘记密码
目录 1.修改密码 客户端响应 前端vue 后端 controller层 ServiceImpl实现层 2.忘记密码 客户端响应 后端 controller层 serviceImpl实现层 本章需要准备:springcloud项目,依赖,数据库.... 数据库SQL SET FOREIGN_KEY_CHECKS0;-- -…...
ffmpeg安装
简介 FFmpeg是一个开源的音视频处理库,它提供了一系列的工具和API,可以用于处理音视频文件。你可以使用FFmpeg的命令行工具来执行各种音视频处理操作,比如转码、剪辑、合并等。FFmpeg的命令格式通常是:ffmpeg [全局选项] {[输入文…...
Mac电脑目录
System(系统)Applications(应用程序)应用程序目录,默认所有的GUI应用程序都安装在这里User(用户)存放用户的个人资料和配置。每个用户有自己的单独目录Library(资料库)系…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
