Java笔记18
2-10-3Cookie&Session
1.会话跟踪技术概述
- 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
- 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
- HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享
2.Cookie基本使用
- Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
- Cookie基本使用
发送Cookie
1.创建Cookie对象,设置数据
Cookie cookie = new Cookie("key","value");
2.发送Cookie到客户端:使用response对象
response.add Cookie(cookie);
获取Cookie
3.获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
4.遍历数组,获取每一个Cookie对象:for
5.使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
3.Cookie原理
Cookie的实现是基于HTTP协议的
- 响应头:set-cookie
- 请求头:cookie
工作原理步骤
- 服务器发 Cookie:用户访问网页,服务器处理请求时,在 HTTP 响应头用
Set - Cookie
字段发 Cookie 给浏览器。比如服务器想记住用户身份,就发个含身份信息的 Cookie。 - 浏览器存 Cookie:浏览器收到响应,解析
Set - Cookie
字段,把 Cookie 存本地,有内存和硬盘两种存储方式。 - 浏览器传 Cookie:浏览器再次访问同一服务器时,会在 HTTP 请求头的
Cookie
字段带上之前存的 Cookie 信息。 - 服务器用 Cookie:服务器收到请求,解析
Cookie
字段获取信息,根据信息做相应处理,像识别用户身份。
Cookie 属性作用
- Name - Value:存具体数据。
- Domain 和 Path:限定能访问 Cookie 的域名和页面路径。
- Expires/Max - Age:设定 Cookie 过期时间,没设就是会话 Cookie,关浏览器就删。
- Secure:让 Cookie 只在 HTTPS 请求中传输,更安全。
- HttpOnly:使 Cookie 只能通过 HTTP 请求访问,防脚本攻击偷信息。
4.Cookie使用细节
Cookie存活时间
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
setMaxAge(int seconds):设置Cookie存活时间
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。至到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
//发送Cookie
//1. 创建Cookie对象
Cookie cookie = new Cookie("username", "zs");
//设置存活时间 ,1周 7天
cookie.setMaxAge(60*60*24*7);
//2. 发送Cookie,response
response.addCookie(cookie);
}
5.Cookie使用细节-存储中文
- Cookie存储中文
- Cookie不能直接存储中文
- 如需要存储,则需要进行转码:URL编码
//1. 获取COOKIE数组
Cookie[] cookies = request.getCookies();//2. 遍历数组
for (Cookie cookie : cookies) {//3. 获取数据String name = cookie.getName();if("username".equals(name)){String value = cookie.getValue();//URL解码value = URLDecoder.decode(value, "UTF-8");System.out.println(name+":"+value);}
}
6.Session基本使用
- 服务端会话跟踪技术:将数据保存到服务端
- JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能
- 使用:
1.获取Session对象
Http Session session = request.getSession();
2.Session对象功能:
- void setAttribute(String name, Objecto):存储数据到session 成中
- Object getAttribute(String name):根据key,获取值
- void removeAttribute(String name):根据key,删除该键值双时
7.Session原理
//存储到Session中
//1. 获取Session对象
HttpSession session = request.getSession();
//2. 存储数据
session.setAttribute("username", "zs");
//获取数据,从session中
//1. 获取Session对象
HttpSession session = request.getSession();
//2. 获取数据
Object username = session.getAttribute("username");
System.out.println(username);
}
8.Session-使用细节
- Session钝化、活化:
- 服务器重启后,Session中的数据是否还在?
- 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
- 活化:再次启动服务器后,从文件中加载数据到Session中
- 服务器重启后,Session中的数据是否还在?
- Seesion销毁:
- 默认情况下,无操作,30分钟自动销毁
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 调用Session对象的invalidate()方法
小结:
- Cookie和Session都是来完成一次会话内多次请求间数据共享的
- 区别:
- 存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端
- 安全性:Cookie不安全,Session安全
- 数据大小:Cookie最大3KB,Session无大小限制
- 存储时间:Cookie可以长期存储,Session默认30分钟
- 服务器性能:Cookie不占服务器资源,Session占用服务器资源
案例:
用户登录:
Web层
UserMapper
public interface UserMapper {/*** 根据用户名和密码查询用户对象* @param username* @param password* @return*/@Select("select * from tb_user where username = #{username} and password = #{password}")User select(@Param("username") String username,@Param("password") String password);/*** 根据用户名查询用户对象* @param username* @return*/@Select("select * from tb_user where username = #{username}")User selectByUsername(String username);
/*** 添加用户* @param user*/
@Insert("insert into tb_user values(null,#{username},#{password})")
void add(User user);
}
Service层
UserService
public class UserService {SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();/*** 登录方法* @param username* @param password* @return*/public User login(String username, String password){//2. 获取SqlSessionSqlSession sqlSession = factory.openSession();//3. 获取UserMapperUserMapper mapper = sqlSession.getMapper(UserMapper.class);//4. 调用方法User user = mapper.select(username, password);//释放资源sqlSession.close();return user;}
}
Dao层
LoginServlet
private UserService service = new UserService();@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {//1. 获取用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");//2. 调用service查询User user = service.login(username, password);//3. 判断if(user != null){//登录成功,跳转到查询所有的BrandServlet//将登陆成功后的user对象,存储到sessionHttpSession session = request.getSession();session.setAttribute("user", user);String contextPath = request.getContextPath();response.sendRedirect(contextPath+"/selectAllServlet");}else {// 登录失败,// 存储错误信息到requestrequest.setAttribute("login_msg", "用户名或密码错误");// 跳转到login.jsprequest.getRequestDispatcher("/login.jsp").forward(request, response);}
}
案例:记住用户
- 如果用户勾选"记住用户",则下次访问登陆页面自动填充用户名密码
- 如何自动填充用户名和密码?
- 1.将用户名和密码写入Cookie中,并且持久化存储Cookie,下次访问浏览器会自动携带Cookie
- 2.在页面获取Cookie数据后,设置到用户名和密码框中
- 何时写Cookie?
- 1.登录成功
- 2.用户勾选记住用户复选框
private UserService service = new UserService();@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {//1. 获取用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");//获取复选框数据String remember = request.getParameter("remember");//2. 调用service查询User user = service.login(username, password);//3. 判断if(user != null){//登录成功,跳转到查询所有的BrandServlet//判断用户是否勾选记住我if("1".equals(remember)){//勾选了,发送Cookie//1. 创建Cookie对象Cookie c_username = new Cookie("username",username);Cookie c_password = new Cookie("password",password);//设置Cookie的存活时间c_username.setMaxAge(60 * 60 * 24 * 7);c_password.setMaxAge(60 * 60 * 24 * 7);//2. 发送response.addCookie(c_username);response.addCookie(c_password);
}//将登陆成功后的user对象,存储到sessionHttpSession session = request.getSession();session.setAttribute("user", user);String contextPath = request.getContextPath();response.sendRedirect(contextPath+"/selectAllServlet");}else {// 登录失败,// 存储错误信息到requestrequest.setAttribute("login_msg", "用户名或密码错误");// 跳转到login.jsprequest.getRequestDispatcher("/login.jsp").forward(request, response);}
}
案例:记住用户获取Cookie
2.在页面获取Cookie数据后,设置到用户名和密码框中:
${cookie.key.value}//key指存储在cookie中的键名称
<body>
<div id="loginDiv" style="..."><form action="/brand-demo/loginServlet" id="form"><h1 id="loginMsg">LOGIN IN</h1><div id="errorMsg">${login_msg}</div><p>Username:<input id="username" name="username" value="${cookie.username.value}" type="text"></p><p>Password:<input id="password" name="password" value="${cookie.password.value}" type="password"><p>Remember:<input id="remember" name="remember" value="1" type="checkbox"></p><div id="subDiv"><input type="submit" class="button" value="login up"><input type="reset" class="button" value="reset"><a href="register.html">没有账号?</a></div></form>
</div>
</body>
案例:用户注册
注册功能:保存用户信息到数据库
验证码功能:
展示验证码:展示验证码图片,并可以点击切换
校验验证码:验证码填写不正确,则注册失败
Dao层
UserMapper
public interface UserMapper {/*** 根据用户名和密码查询用户对象* @param username* @param password* @return*/@Select("select * from tb_user where username = #{username} and password = #{password}")User select(@Param("username") String username,@Param("password") String password);/*** 根据用户名查询用户对象* @param username* @return*/@Select("select * from tb_user where username = #{username}")User selectByUsername(String username);
/*** 添加用户* @param user*/
@Insert("insert into tb_user values(null,#{username},#{password})")
void add(User user);
}
Service层
UserService
public boolean register(User user){//2. 获取SqlSessionSqlSession sqlSession = factory.openSession();//3. 获取UserMapperUserMapper mapper = sqlSession.getMapper(UserMapper.class);//4. 判断用户名是否存在User u = mapper.selectByUsername(user.getUsername());if(u == null){// 用户名不存在,注册mapper.add(user);sqlSession.commit();}
}
Web层
RegisterServlet
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {private UserService service = new UserService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {//1. 获取用户名和密码数据String username = request.getParameter("username");String password = request.getParameter("password");User user = new User();user.setUsername(username);user.setPassword(password);//2. 调用service 注册boolean flag = service.register(user);//3. 判断注册成功与否if(flag){//注册功能, 跳转登陆页面request.setAttribute("register_msg", "注册成功,请登录");request.getRequestDispatcher("/login.jsp").forward(request,response);}else {//注册失败, 跳转到注册页面request.setAttribute("register_msg", "用户名已存在");request.getRequestDispatcher("/register.jsp").forward(request,response);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {this.doGet(request, response);
}}
}
案例:验证码
注册功能:保存用户信息到数据库
验证码功能:
展示验证码:展示验证码图片,并可以点击切换
校验验证码:验证码填写不正确,则注册失败
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;public class CheckCodeUtil {// 验证码字符集private static final String CHAR_SET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";// 验证码长度private static final int CODE_LENGTH = 4;// 图片宽度private static final int IMG_WIDTH = 100;// 图片高度private static final int IMG_HEIGHT = 50;/*** 生成验证码图片并保存到指定文件,返回验证码字符串* @param width 图片宽度* @param height 图片高度* @param filePath 保存图片的文件路径* @return 验证码字符串* @throws IOException 保存图片时可能抛出的异常*/public static String outputVerifyImage(int width, int height, String filePath) throws IOException {String verifyCode = generateVerifyCode();BufferedImage image = createImage(width, height, verifyCode);saveImage(image, filePath);return verifyCode;}/*** 生成随机验证码字符串* @return 验证码字符串*/private static String generateVerifyCode() {Random random = new Random();StringBuilder code = new StringBuilder();for (int i = 0; i < CODE_LENGTH; i++) {int index = random.nextInt(CHAR_SET.length());code.append(CHAR_SET.charAt(index));}return code.toString();}/*** 创建包含验证码的图片* @param width 图片宽度* @param height 图片高度* @param verifyCode 验证码字符串* @return 包含验证码的图片*/private static BufferedImage createImage(int width, int height, String verifyCode) {// 创建 BufferedImage 对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();// 设置背景颜色g.setColor(Color.WHITE);g.fillRect(0, 0, width, height);// 设置字体g.setFont(new Font("Arial", Font.BOLD, 20));// 设置文字颜色g.setColor(Color.BLACK);// 绘制验证码字符for (int i = 0; i < verifyCode.length(); i++) {g.drawString(String.valueOf(verifyCode.charAt(i)), 20 * i + 10, 30);}// 绘制干扰线drawNoiseLines(g, width, height);g.dispose();return image;}/*** 绘制干扰线* @param g 图形上下文* @param width 图片宽度* @param height 图片高度*/private static void drawNoiseLines(Graphics g, int width, int height) {Random random = new Random();g.setColor(Color.GRAY);for (int i = 0; i < 5; i++) {int x1 = random.nextInt(width);int y1 = random.nextInt(height);int x2 = random.nextInt(width);int y2 = random.nextInt(height);g.drawLine(x1, y1, x2, y2);}}/*** 保存图片到指定文件* @param image 要保存的图片* @param filePath 保存图片的文件路径* @throws IOException 保存图片时可能抛出的异常*/private static void saveImage(BufferedImage image, String filePath) throws IOException {File outputFile = new File(filePath);ImageIO.write(image, "jpg", outputFile);}public static void main(String[] args) {try {String filePath = "d://a.jpg";String checkCode = outputVerifyImage(IMG_WIDTH, IMG_HEIGHT, filePath);System.out.println("生成的验证码是: " + checkCode);System.out.println("验证码图片已保存到: " + filePath);} catch (IOException e) {e.printStackTrace();}}
}
案例:校验验证码
判断程序生成的验证码 和 用户输入的验证码是否一样,如果不一洋,则阻止注册
验证码图片访问和提交注册表单是两次请求,所以要将程序生成的验证码存入Sessio
CheckCodeServlet
将验证码存入session
// 生成验证码
ServletOutputStream os = response.getOutputStream();
String checkCode = CheckCodeUtil.outputVerifyImage(100, 50, os, 4);// 存入Session
HttpSession session = request.getSession();
session.setAttribute("checkCodeGen",checkCode);
}
RegisterServlet
1.接收用户输入验证码
2.比对
// 获取用户输入的验证码
String checkCode = request.getParameter("checkCode");// 程序生成的验证码,从Session获取
HttpSession session = request.getSession();
String checkCodeGen = (String) session.getAttribute("checkCodeGen");if(!checkCodeGen.equalsIgnoreCase(checkCode)){request.setAttribute("register_msg", "验证码错误");request.getRequestDispatcher("/register.jsp").forward(request, response);// 不允许注册return;
}
相关文章:
Java笔记18
2-10-3Cookie&Session 1.会话跟踪技术概述 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次…...

LangChain大模型应用开发:构建Agent智能体
介绍 大家好,博主又来给大家分享知识了。今天要给大家分享的内容是使用LangChain进行大模型应用开发中的构建Agent智能体。 在LangChain中,Agent智能体是一种能够根据输入的任务或问题,动态地决定使用哪些工具(如搜索引擎、数据库查询等)来…...

巧用GitHub的CICD功能免费打包部署前端项目
近年来,随着前端技术的发展,前端项目的构建和打包过程变得越来越复杂,占用的资源也越来越多。我有一台云服务器,原本打算使用Docker进行部署,以简化操作流程。然而,只要执行sudo docker-compose -f deploy/…...

【2】常用cmd命令大全、使用cmd运行和编译Java程序
文章目录 一、常用cmd命令大全文件和目录操作系统信息查看磁盘管理网络操作其他常用命令 二、使用cmd命令运行和编译Java程序 一、常用cmd命令大全 cmd的常用命令较多,java初学者只需了解这几个即可 dir:查看当前路径下的所有文件夹 cd:进入指…...
UniApp SelectorQuery 讲解
一、SelectorQuery简介 在UniApp中,SelectorQuery是一个非常强大的工具,它允许开发者查询节点信息。通过这个API,我们可以获取到页面元素的尺寸、位置、滚动条位置等信息。这在处理动态布局、动画效果或是用户交互时尤为重要。 二、基本使用…...

【行业解决方案篇十一】【DeepSeek零售分析:客流热力图生成系统】
开篇:当商店开始"思考" 你可能不知道,现在北京三里屯的优衣库旗舰店,每天要处理超过3000个顾客的移动轨迹数据。这些数据不是用来监控,而是让店铺自己"学会"把畅销款T恤摆在哪里最能促进销量。今天要讲的DeepSeek零售分析系统,就是这样一个能把"…...

车载DoIP协议 --- TCP详细解析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
C++关键字之mutable
1.介绍 在C中,mutable是一个关键字,用于修饰类的成员变量。它的主要作用是允许在常量成员函数或常量对象中修改被标记为mutable的成员变量。通常情况下,常量成员函数不能修改类的成员变量,但有些情况下,某些成员变量的…...
设计模式| 观察者模式 Observer Pattern详解
目录 一、概述1.1 动机1.2 核心思想1.3 别名 二、角色与实现原理2.1 角色2.2 实现原理2.3 类图 三、经典接口实现3.1 示例3.1.1 观察者接口3.1.2 目标接口3.1.3 具体被观察者3.1.4 具体观察者3.1.5 Client3.1.6 UML时序图 3.2 特点 四、其他实现方式4.1 委托与事件(…...
Git-速查
Git 安装 Git 之后,你可以… 配置全局用户信息(推荐) 全局设置,创建本地仓库时默认分支名称为 main(你需要什么名称就该什么名称)【推荐配置为 main 】 git config --global init.defaultBranch main全…...
Spring Boot嵌入式服务器深度解析:从配置到调优的全方位指南
文章目录 引言一、嵌入式服务器核心原理1.1 架构设计特点1.2 主流服务器对比 二、嵌入式服务器配置实战2.1 基础配置模板2.2 HTTPS安全配置 三、高级调优策略3.1 线程池优化(Tomcat示例)3.2 响应压缩配置3.3 访问日志配置 四、服务器切换实战4.1 切换至U…...
深入解析浏览器渲染全流程:从URL输入到页面渲染的底层原理与性能优化(附实战代码)
本文以https://example.com为例,逐层剖析浏览器从输入URL到页面渲染的完整链路,涵盖DNS解析、TCP/TLS握手、HTTP请求、DOM/CSSOM构建等核心阶段,结合代码示例与性能调优技巧,助你掌握浏览器底层运行机制。 一、导航阶段࿱…...

【网络安全】常见的web攻击
1、SQL注入攻击 定义: 攻击者在HTTP请求中注入恶意的SQL代码,当服务器利用参数构建SQL语句的时候,恶意的SQL代码被一起构建,并在数据库中执行。 示例: 用户登录: 输入用户名xx, 密码 or 1 …...
MySQL面试学习
MySQL 1.事务 事务的4大特性 事务4大特性:原子性、一致性、隔离性、持久性 原⼦性: 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么全不执行一致性: 执⾏事务前后,数据保持⼀…...

一文读懂Docker之Docker Compose
目录 一、Docker Compose简介 二、Docker Compose的安装和基本使用 1、Docker Compose的安装 步骤一、下载docker-compose 步骤二、新增可执行权限 步骤三、查看是否安装成功 2、Docker Compose的基本使用 (1)、docker-compose up (2)、docker-compose ps (3)、docke…...
escape SQL中用法
select * from tablename where username like %#%% escape # 这个的意思就是,escape指定字符#,#字符后面的第一个字符被认为是普通字符 查询示例2 查询username字段中包含[的数据也是一样,即: select * from tablename where us…...

Cherno C++ P57 Standard array处理静态数组
这篇文章当中我们讲一下如何使用C自带的standard array来处理静态数组。 首先什么是静态数组,静态数组通常指的是不会增长的数据,长度是已经确定了的。我们在定义数组的时候就必须确定好长度与类型。 其次C当中也确实给我们提供了一些可以用来处理静态…...

linux学习【7】Sourc Insight 4.0设置+操作
目录 1.Source Insight是什么?2.需要哪些配置?3.怎么新建项目4.一些问题的解决1.中文乱码问题 5.常规使用1. 在工程中打开文件2. 在文件中查看函数或变量的定义3. 查找函数或变量的引用4. 快捷键 按照这个设置就可以了,下面的设置会标明设置理…...

JDK、Hadoop下载地址
一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 刚进去是最新的版本,往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以选版本等选项卡 三、Hadoop Apache Download Mirrors...
【小白向超详细】使用 VSCode 远程连接 Linux 服务器详细教程
使用 VSCode 远程连接 Linux 服务器详细教程 前提条件 已安装 VSCode。已在 VSCode 中安装 Remote - SSH 插件。目标 Linux 服务器 开启了 SSH 服务,并可以通过 SSH 访问。本地电脑已安装 SSH 客户端(Linux 和 macOS 自带,Windows 用户可以…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...