统一功能处理
SpringBoot统一功能处理
本节目表
1.掌握拦截器的使用,及其原理
2.学习统一数据返回格式和统一异常处理的操作
3.了解一些Spirng的源码
文章目录
- SpringBoot统一功能处理
- 前言
- 一、拦截器是什么?
- 二、使用步骤
- 1.定义拦截器
- 2.注册配置拦截器
- 三,适配器
- 四丶统一数据返回格式
- 五、统一异常处理
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
前面我们实现了强制登录的功能,后端程序根据Session来判断用户是否登录,但是实现方法是比较麻烦的
需要修改每个接口的处理逻辑
需要修改每个接口的返回结果
接口定义修改,前段代码也需要跟着修改
提示:以下是本篇文章正文内容,下面案例可供参考
一、拦截器是什么?
拦截器是Spring框架提供的核心功能之一,主要用来拦截用户的请求,在指定方法(接口)前后,根据业务需要执行预先设定的代码
也就是说,允许开发人员提前预定以一些逻辑,在用户请求响应前后执行,也可以在用户请求前阻止其执行
在拦截器当中,开发人员可以在应用程序中做一些通用性的操作,比如通过拦截器来拦截前端发来的请求,判断Session中是否有登录用户信息,如果有就可以放心,如果没有就进行拦截
生活中实际的例子: 比如我们去银行办理业务,在办理业务前后,就可以加一些拦截操作 办理业务之前,先取号,如果带了身份证了就取号成功
业务办理结束,给业务办理人员进行评价 这就是"拦截器"做到工作
二、使用步骤
拦截器使用步骤有两步
- 定义拦截器 2. 注册拦截器
1.定义拦截器
自定义拦截器:实现HandlerInterceptor接口, 并重写其所有方法
代码如下(示例):登录拦截器
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {//定义拦截器 实现父类的所有方法@Autowiredprivate ObjectMapper objectMapper;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("登录拦截...");//true 放行 false 拦截//判断用户是否登录 判空和有值HttpSession session = request.getSession();if(session.getAttribute(Constants.SESSION_USER_KEY)==null||!StringUtils.hasLength((String) session.getAttribute(Constants.SESSION_USER_KEY))){//未登录进行拦截 ,需要设置一些响应 返回给客服端log.error("用户未登录,进行拦截");response.setStatus(HttpStatus.UNAUTHORIZED.value());//设置状态码,没权限401response.setContentType("application/json,charset=utf-8");//设置返回数据格式为json
// response.getOutputStream().write("{\"ok\" : false}".getBytes());//设置返回的内容Result result = Result.unlogin();//登录失败,返回统一格式response.getOutputStream().write(objectMapper.writeValueAsString(result).getBytes());return false;}log.info("用户登录校验通过");return true;}
代码说明
创建了一个拦截器LoginInterceptor类 ,实现了HandlerInterceptor接口,使用接口中的preHandle()方法,返回值为bool类型 true 为放行,false 为拦截 ,当前拦截器是判断是否存在登录的Session,有就登录成功,执行后续代码,否则可以设置一些返回结果比如设置状态码,设置返回数据格式,统一返回响应内容
> 记得在前后打印日志 !!!
2.注册配置拦截器
代码如下(示例):
@Slf4j
@Configuration
public class WebConfig implements WebMvcConfigurer {//注册web拦截器,实现拦截器功能和指定接口//注入“登录拦截器”@Autowiredprivate LoginInterceptor loginInterceptor;//实现父类方法(注册拦截器)@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/book/**");}
}
代码说明
创建了WebConfig类 实现了 WebMvcConfigurer的接口 见名思意,“webmvc” 就要设计到一些前后端交互的内容,那么这个类真正的作用在于,注册拦截器,设置拦截器的使用目标,
代码体现在于,实现了父类的方法 addInterceptors (添加拦截器) ,根据参数registry来调用 addInterceptor方法进行添加我们定义的LoginInterceptor, addPathPatterns(“/**”)表示前后端交互的接口,对那些接口使用拦截器当然 也可以对这些接口中的特殊进行限制不使用拦截器 即excludePathPatterns方法
当用户访问一个接口时,第一时间并不是直接去和Controller进行交互,而是先通过“保安” (拦截器)验证身份之后才能顺利与Controller获取联系
拦截路径说明
拦截流程
正常的调用顺序:
有了拦截器之后,会在调用Controller之前进行相应的业务处理,执行的流程图如下
1.添加拦截器后,执行Controller方法之前,请求首先会被拦截器拦截住,执行preHandle()方法,这个方法需要返回一个布尔类型值,如果返回true,就表示放行本次操作,继续访问Controller中的方法,如果返货false,则不会放行
2.controller当中的方法执行完毕后,再回来执行PostHandle()这个方法以及afterCompletion()方法,执行完毕后,最终响应结果给浏览器
三,适配器
适配器模式定义:适配器模式,也叫包装器模式,将一个类的接口转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
简单来说就是目标类不能直接使用,通过一个新类进行包装一下,适配器调用方使用。把两个不兼容的接口通过一定的方式使之兼容
比如下面两个接口,本身是不相容的(参数类型,个数都不一样)
通过适配器的方式,使之兼容
实际生活中的列子, 转换插头!!
对于java选手来说,面向对象变成 ,我们就得到实际摸得着的类入手
因此适配器模式角色可以分为以下几个对象
- Target:目标接口,客服希望直接使用的接口
- Adaptee:适配者,与Target不兼容
- Adaptor:适配器类,此模式的核心,通过继承或者引用适配者的对象,把适配转为目标接口
- client:需要使用适配器的对象
适配器模式的实现
场景:前面学习的skf4j就使用了适配器模式,slf4j提供了一系列打印日志的api,底层调用的是log4j或者logback来打印日志,我们作为调用者,止血药调用slf4j的api就行了
Slf4jApi为目标接口,Log4jApi用户接口 ,需要一个 Slf4jLog4jAdaptor适配器使两者兼容,Client是用户使用的类
目标接口
public interface Slf4jApi {//目标接口public void log(String log);
}用户需要的接口
public class Log4jApi {public String print(String log) {return log;}
}适配器
public class Slf4jLog4jAdaptor implements Slf4jApi {private Log4jApi log4jApi;public Slf4jLog4jAdaptor(Log4jApi log4jApi) {this.log4jApi = log4jApi;}@Overridepublic void log(String log) {log4jApi.print(log);}
}
客服端调用
public class Client {public static void main(String[] args) {Slf4jApi slf4j = new Slf4jLog4jAdaptor(new Log4jApi());slf4j.log("打印日志");}
}
可以看出,我们不需要改变log4j的api(提前规定好的接口 ,不能修改),只能使用适配进行转换,就可以更换日志框架,保障系统的运行
应用场景
一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷,应用这种模式算是无奈之举,如果在设计初期,我们就能协调规避接口不兼容的问题,就不需要使用适配器模式了
所以适配器模式更多的应用场景主要是对正在运行的代码进行改造,并且希望可以复用原来代码的实现功能
四丶统一数据返回格式
在强制登录的案例中,我们做了两部分工作
1.通过Session来判断用户是否登录
2.对后端返回的数据进行封装,告诉前段处理的结果
对于第一个问题,拦截器可以实现对需要的接口进行了拦截的处理,以此判断用户是否登录,这一实现避免了之前对每个接口都要进行校验Session是否有值,而使用拦截器统一的处理会更方便,简单!!!
对于第二个问题,在之前我们需要对每一个接口进行封装,响应给前端的统一结果也有进行修改,因此,SpringBoot 提供了统一返回结果的功能
对接口进行封装
封装对象
@Data
public class Result<T> {private Integer code;private String errMsg;private T data;public static <T> Result<T> success(T data) {Result result = new Result();result.setCode(Constants.SUCCESS_CODE);result.setErrMsg("");result.setData(data);return result;}public static <T> Result<T> unlogin() {Result result = new Result();result.setCode(Constants.UNLOGIN_CODE);result.setErrMsg("用户未登录");return result;}public static <T> Result<T> fail() {Result result = new Result();result.setCode(Constants.FAIL_CODE);result.setErrMsg("程序出错");return result;}
}
代码说明
统一返回Result对象
属性:
1.code 表示状态码 200 登陆成功 -1:未登录 -2:程序出错 通过 Constant静态常量 来自定义;
2.errMSg 表示错误信息 success(“”) ,fail(“程序出错”), unlogin(“未登录”);
3.data 表示各类接口返回的信息, 返回类型不同 , 使用泛型
方法: public static Result xxx(){}
1.success(T data) 表示登录成功, 创建并设置成功时的信息(code,errmsg,data),并返回这个对象
2.fail() 表示登录失败,程序出错,创建并设置失败的信息,返回该对象
3.unlogin 表示未登 , 创建并设置未登录的信息,返回该对象
现在,我们使用了统一结果返回的功能后,简化了对每个接口的封装效果,有效的整理成了如下代码
以下是代码演示:使目标接口返回结果统一是Result类型
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Autowiredprivate ObjectMapper objectMapper;@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {if (body instanceof Result<?>){return body;}if (body instanceof String){return objectMapper.writeValueAsString(Result.success(body));}return Result.success(body);}
}
代码说明
统一数据返回格式使用@ControllerAdvice 和 ResponseBodyAdvice的方式实现@ControAdvice表示控制器通知类,
**添加类ResponseAdvie,实现ResponseBodyAdvice接口,并在接口添加@ControllerAdvice注解
方法说明
1.supports方法,通过returnType参数来获取某个类某个方法
判断是否要执行beforeBodyWrite方法,true表示执行,false不执行,通过该方法可以选择那些类或那些方法的response要进行处理,其他的不进行处理,(上述代码直接设定了true表示对每个接口都要进行处理)
2.beforeBodyWrite方法,通过body来接收每个接口返回的响应response
如果一些方法结果已经是Result类型,直接返回body,不做处理
特例是若body是String类型,需要额外的进行处理(目前不懂这串代码):(具体含义是把Result对象转换为了String字符串,而不是对象,因此需要转换为JSON对象)
其他情况下,一律返回Result的类型
若需要测试,统一使用postman进行测试
优点:
1.方便前端程序员更好的接收和解析后端数据接口返回的数据
2.降低前端程序员和后端程序员的沟通成本,按照某个格式实现就可以了,因为所有接口都是这样返回的
3.有利于项目统一数据的维护和修改
4.有利于后端技术部门的统一规范的标准规定,不会出现稀奇古怪的返回内容
五、统一异常处理
测试异常
@RestController
@RequestMapping("/test")
public class TestController {@RequestMapping("/t1")public String t1(){int a = 10/0;return "t1";}//数组越界异常@RequestMapping("/t2")public int t2(){int[] arr = new int[3];return arr[4];}//空指针异常@RequestMapping("/t3")public int t3(){String a = null;return a.length();}
}
捕获异常
@Slf4j
@ControllerAdvice
@ResponseBody
public class ExceptionAdvice {//捕获程序中出现的异常,进行处理@ExceptionHandlerpublic Object hander(Exception e){log.error("发生异常 e:{}" , e);return Result.fail();}@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ExceptionHandlerpublic Object handler(ArrayIndexOutOfBoundsException e){log.error("发生异常 e:{}" , e);return Result.fail("发生数组越界异常...");}@ExceptionHandlerpublic Object handler(NullPointerException e){log.error("发生异常 e:{}" , e);return Result.fail("发生空指针异常...");}
}
代码说明
建立ExceptionAdvice类, 使用了类@ControllerAdvice (表示控制器通知类)和方法注解@ExceptionHandler(表示异常处理器)进行捕获异常,两者结合表示当出现异常的时候执行某个通知,也就是执行某个方法事件
如果程序中发生了异常,就会被改类捕捉到并且匹配到响应的异常,若匹配不到就直接可以匹配Exception的子类
注意
接口返回数据时,需要加上@ResponseBody注解 或则会返回视图导致找不到而报错
!!!!
**@ResponseStatus()注解是用来设置状态码!!!**
总结
提示:这里对文章进行总结:
本节课我们实现了拦截器,统一返回数据格式,统一异常处理,实现了对每个接口进行了 “封装” ,在访问这个接口前执行了什么方法逻辑,或是在返回后的数据执行了什么方法逻辑, 又或者是在接口中出现问题的时候进行了统一的处理。这极大的抽取了共同的需求,和简化了真实的封装效果,为项目进一步的改善。
相关文章:
统一功能处理
SpringBoot统一功能处理 本节目表 1.掌握拦截器的使用,及其原理 2.学习统一数据返回格式和统一异常处理的操作 3.了解一些Spirng的源码 文章目录 SpringBoot统一功能处理前言一、拦截器是什么?二、使用步骤1.定义拦截器2.注册配置拦截器 三,适…...
LibreOffice Writer使用01去除单词拼写判断的红色下划线
这个软件还是非常有特色的,因为大家需要office的全部功能,常常忽略了这个软件的使用体验。 csdn不是特别稳定,linux也没有什么比较好的md编辑器,所以我选择这个软件来记录我的临时博客,原因无他,它可以保存…...
JAVA基础 - 高效管理线程隔离数据结构ThreadLocalMap
欢迎光临小站:致橡树 ThreadLocalMap 是 ThreadLocal 的核心底层数据结构,负责在每个线程中存储与 ThreadLocal 实例绑定的数据。它的设计目标是高效管理线程隔离数据,同时尽量减少内存泄漏风险。以下是其核心实现细节。 数据结构与设计目标…...
每日一题(小白)暴力娱乐篇25
由题意直知,要求将给定的字符串转为符合格式的字符串。首先我们来思考一下例如02/02/02这样的数字日月肯定不用进行修改,修改后需要加上对应的年份的前两位,题目要求1960年1月1日~2059年12年12月31日,(对1960年至2059年…...
地表水-地下水耦合建模全景解析暨SWAT-MODFLOW地表与地下协同模拟及多情景专题应用
第一、模型原理与层次结构 1.1流域水循环与SWAT模型 1.2 地下水模拟与MODFLOW模型 1.3 SWAT-MODFLOW地表-地下耦合模型 1.4 QSWATMOD 插件与功能介绍 1.5 模型实现所需软件平台 第二、QGIS软件 2.1 QGIS平台 2.2 QGIS安装 2.3 QGIS界面认识 2.4 QGIS常见数据格式 2.…...
在线论坛系统
在线论坛 项目介绍项目使用技术介绍前端技术栈后端技术栈 项目运行步骤说明后端运行步骤前端运行步骤 项目使用说明用户端功能管理员端功能 部分功能说明运行截图用户端管理员端 系统源码 项目介绍 这是一个基于现代技术栈开发的在线论坛系统,提供用户交流、内容分享…...
webrtc pacer模块(一) 平滑处理的实现
Pacer起到平滑码率的作用,使发送到网络上的码率稳定。如下的这张创建Pacer的流程图,其中PacerSender就是Pacer,其中PacerSender就是Pacer。这篇文章介绍它的核心子类PacingController及Periodic模式下平滑处理的基本流程。平滑处理流程中还有…...
新能源车「大三电」与「小三电」
一、大三电系统 动力电池 作为整车的能量核心,目前主流类型包括三元锂电池(NCM/NCA)和磷酸铁锂电池(LFP),前者能量密度高,后者安全性和成本优势显著。动力电池通过模组串联形成电池包…...
xlinx GT传输器学习
xlinx有2路refclk会输入到gtbank。此2路bank输入时钟是差分输入,经过IBUFDS_GTE2源语转换为单端。如下图。 从fpga外输入高速差分时钟。 差分时钟转换为单端。 单端时钟输入到gt_common模块 下图为gt内部结构图...
C++笔记之父类引用是否可以访问到子类特有的属性?
C++笔记之父类引用是否可以访问到子类特有的属性? code review! 参考笔记 1.C++笔记之在基类和派生类之间进行类型转换的所有方法 文章目录 C++笔记之父类引用是否可以访问到子类特有的属性?1.主要原因2.示例代码3.说明4.如何访问子类特有的属性5.注意事项6.总结在 C++ 中,…...
基于SSM框架的房屋租赁小程序开发与实现
概述 一个基于SSM框架开发的微信小程序房屋租赁管理系统,该项目实现了用户管理、中介管理、房源信息管理等核心功能。 主要内容 一、管理员模块功能实现 用户管理 管理员可对通过微信小程序注册的用户信息进行修改和删除操作,确保用户数据的准…...
大模型评估论文粗读“AGIEval: A Human-Centric Benchmark for Evaluating Foundation Models“
Zhong W, Cui R, Guo Y, et al. Agieval: A human-centric benchmark for evaluating foundation models[J]. arXiv preprint arXiv:2304.06364, 2023. 摘要翻译 评估大模型在处理人类层级的任务时的通用能力,是AGI发展和应用中至关重要的一环。传统的衡量标准通常依…...
程序化广告行业(76/89):行业融资全景剖析与代码应用拓展
程序化广告行业(76/89):行业融资全景剖析与代码应用拓展 大家好!在之前的文章里,咱们一起了解了程序化广告行业的发展趋势以及PC端和移动端投放的差异。今天,咱们接着深入学习,这次聚焦在程序化…...
网工基础 | 常见英文术语注解
原创:厦门微思网络 以下是一些网工专业常见的英文术语注解: IP Address(Internet Protocol Address) 互联网协议地址,是分配给连接到互联网的设备的唯一标识符,用于在网络中定位和通信。例如,“…...
【FPGA开发技巧】Modelsim仿真中,显示状态机的名称,而非编码数字
示例 被仿真的文件名为:cmd_handle.v,其中有r_st_current和r_st_next两个状态机变量。 该模块在tb文件中,被例化的名称为cmd_handle_u0 按照如下格式写:cmd_handle_u0.r_st_current 示例tb文件: timescale 1ns / 1…...
二分答案----
二分答案 - 题目详情 - HydroOJ 问题描述 给定一个由n个数构成的序列a,你可以进行k次操作,每次操作可以选择一个数字,将其1,问k次操作以后,希望序列里面的最小值最大。问这个值是多少。 输入格式 第一行输入两个正…...
Nginx 命令大全:Linux 与 Windows 系统的全面解析
Nginx 是一个高性能的 HTTP 和反向代理服务器,广泛应用于 Web 服务、负载均衡和反向代理等场景。本文将从 Linux 和 Windows 系统的角度出发,详细解析 Nginx 的常用命令,并区分两种系统之间的差异,帮助你高效地管理和维护 Nginx 服…...
我的计算机网络(总览篇)
总览--网络协议的角度 在一个庞大的网络中,该从哪里去了解呢?我先细细的讲一下我们访问一个网站的全部流程,当我们的电脑连上网络的时候,就会启动DHCP协议,来进行IP地址,MAC地址,DNS地址的分配…...
开源CMS的模块化设计和API接口如何具体影响其扩展性?
优秀的CMS系统都有自己主打的特点,开源CMS凭借其灵活性和低成本优势占据了市场主流地位,而模块化设计与API接口正是其扩展性的两大基石。本文将深入探讨这两大技术特性是如何影响cms的扩展性的。 一、模块化设计:功能解耦与生态繁荣的引擎 …...
【网络原理】网络通信基础
目录 一. 网络发展史 (1)局域网 (2)广域网 二. 网络基础知识 (1)IP地址 (2)端口号 (3)协议 (4)五元组 一. 网络发展史 网络的发…...
Win11系统 VMware虚拟机 安装教程
Win11系统 VMware虚拟机 安装教程 一、介绍 Windows 11是由微软公司(Microsoft)开发的操作系统,应用于计算机和平板电脑等设备 。于2021年6月24日发布 ,2021年10月5日发行 。 Windows 11提供了许多创新功能,增加了新…...
新手宝塔部署thinkphp一步到位
目录 一、下载对应配置 二、加载数据库 三、添加FTP 四、上传项目到宝塔 五、添加站点 六、配置伪静态 七、其他配置 开启监控 八、常见错误 一、打开宝塔页面,下载对应配置。 二、加载数据库 从本地导入数据库文件 三、添加FTP 四、上传项目到宝塔…...
MCU如何查看系统有没有卡死
前言:在我们调试单片机的时候,经常会遇到系统非预期运行的状况。造成系统卡死的原因有很多,主要有:野指针,数组越界,死锁,还有一些while写入的一些逻辑错误。本文就如何排查这些问题,…...
有哪些反爬机制可能会影响Python爬取视频?如何应对这些机制?
文章目录 前言常见反爬机制及影响1. IP 封禁2. 验证码3. 请求头验证4. 动态加载5. 加密与混淆6. 行为分析 应对方法1. 应对 IP 封禁2. 应对验证码3. 应对请求头验证4. 应对动态加载5. 应对加密与混淆6. 应对行为分析 前言 在使用 Python 爬取视频时,会遇到多种反爬…...
【辰辉创聚生物】提供上万种单抗/多抗及其偶联物
辰辉创聚生物致力于提供高质量的一抗(Primary Antibodies)、二抗(Secondary Antibodies)和对照抗体(Control Antibodies),支持分子生物学、免疫学及生物医学科学领域的前沿研究。我们拥有超过40…...
Google Chrome Canary版官方下载及安装教程【适用于开发者与进阶用户】
谷歌浏览器(Google Chrome)以其高性能、强扩展性和良好的用户体验深受全球用户喜爱。在其多个版本中,Chrome Canary因具备最前沿的功能测试环境,成为开发者和技术探索者的首选。如果你希望第一时间体验Google Chrome最新功能&…...
BERT - BERT 模型综述
1. BERT的两个任务 (1)Pre-Training 预训练 Masked LM (MLM) - 让模型预测被隐藏(Mask)掉的token。 例如:输入“我喜欢吃[MASK]”,Label是“我喜欢吃苹果”, 模型需要预测出“苹果”。这种…...
Vue 大文件分片上传组件实现解析
Vue 大文件分片上传组件实现解析 一、功能概述 1.1本组件基于 Vue Element UI 实现,主要功能特点: 大文件分片上传:支持 2MB 分片切割上传实时进度显示:可视化展示每个文件上传进度智能格式校验:支持文件类型、大小…...
Matlab 电机激励模型和仿真
1、内容简介 Matlab 191-电机激励模型和仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 clc close all clear Tn 165;%电机转矩 R 0.05;%定子半径 n0 1800;% 电机转速 i 2;%额定电流 Lmin 4.95;%最小电感 k 82.5; Nr 6;%转子级数 T 60/Nr/n0;%周期 b 0…...
GPU算力优化
GPU(图形处理单元)算力优化是提升计算性能的重要任务,在深度学习、科学计算等领域有重要意义。下面从硬件层面、软件层面和算法层面为你介绍一些优化方法: 硬件层面 选择合适的 GPU:不同的 GPU 在算力、显存、功耗等…...
微服务拆分的原则、时机、方法以及常见问题
前言# 在平常情况下,技术架构会随着业务规模大小、团队人数多少、技术债积累速度等动态变化。当然,引起架构变化最主要的因素还是业务发展速度。 在以前的单体架构到微服务架构演进历程 文章2 等文章中,有一张架构演进的图,如下…...
第十八天 - ELK日志体系集成 - 自定义Logstash插件 - 练习:分布式日志分析平台
前言 在分布式系统和微服务架构中,日志管理是监控系统健康、排查故障的核心环节。ELK(Elasticsearch、Logstash、Kibana)作为业界领先的日志分析解决方案,能够实现日志采集、处理、存储与可视化的全链路管理。本文将手把手带你掌…...
HBuilderX中uni-app打包Android(apk)全流程超详细打包
一、Android生成打包证书 1、Android平台签名证书(.keystore)生成指南_android 签名生成-CSDN博客(如果不上架应用商店可以跳过,可以使用云端证书) 二、打开manifest.json配置基础设置 三、配置安卓应用图标 四、配置安卓启动页图片 五、…...
CTF web入门之命令执行
web29 文件名过滤 由于flag被过滤,需要进行文件名绕过,有以下几种方法: 1.通配符绕过 fla?.* 2.反斜杠绕过 fl\ag.php 3.双引号绕过 fl’‘ag’.php 还有特殊变量$1、内联执行等 此外 读取文件利用cat函数,输出利用system、passthru 、echo echo `nl flag.php`; ec…...
安宝特案例 | 某户外机房制造企业应用AR+作业流,规范制造过程,记录施工节点,保障交付质量
行业特点:产品客制化、依赖人工,工程量大、细节多,验收困难 户外通讯机房无疑是现代工业社会的“信息心脏”,承载着信息交换、传输与处理的重任。建设一座质量过关的户外通讯机房是保障通信稳定运行的基石。 通常建设一个户外通信…...
学习MySQL的第八天
海到无边天作岸 山登绝顶我为峰 一、数据库的创建、修改与删除 1.1 引言 在经过前面七天对于MySQL基本知识的学习之后,现在我们从基本的语句命令开始进入综合性的语句的编写来实现特定的需求,从这里开始需要我们有一个宏观的思想&…...
ESP8266 采集 DHT11 和 DS18B20 温湿度数据 MQTT 上传至 Home Assistant
ESP8266 采集 DHT11 和 DS18B20 温湿度数据 MQTT 上传至 Home Assistant DHT11 采集 DHT11 温湿度数据并通过 MQTT 联网上传至 Home Assistant 智能家居平台; Arduino 代码 #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <Ardui…...
三、TorchRec中的Optimizer
TorchRec中的Optimizer 文章目录 TorchRec中的Optimizer前言一、嵌入后向传递与稀疏优化器融合如下图所示:二、上述图片的关键步骤讲解:三、优势四、与传统优化器对比总结 前言 TorchRec 模块提供了一个无缝 API,用于在训练中融合后向传递和…...
操作系统 4.1-I/O与显示器
外设工作起来 操作系统让外设工作的基本原理和过程,具体来说,它概括了以下几个关键步骤: 发出指令:操作系统通过向控制器中的寄存器发送指令来启动外设的工作。这些指令通常是通过I/O指令(如out指令)来实现…...
Qt 5.14.2 入门(三)基本知识理解
目录 一、新建项目后生成的三个文件的作用和内容1、.h文件:头文件(如mainwindow.h)2、.cpp文件:源文件(如mainwindow.cpp)3、main.cpp:主程序 二、信号和槽机制1、信号(Signal)2、槽(Slot)3、连…...
Java中常见的设计模式
Java中常见的设计模式 Java 中有 23 种经典设计模式,通常被分为三大类:创建型、结构型和行为型。每个设计模式都解决了不同类型的设计问题。以下是几种常见设计模式的总结,并附带了实际应用场景、示例代码和详细的注释说明。 一、创建型设计…...
nltk 是怎么和 Transformers(比如 BERT 模型)联动来处理文本的
🧠 一句话解释nltk: nltk 是一个用于自然语言处理(NLP)的 Python 库,功能包括分词、词性标注、命名实体识别、文本分类等。 全称是:Natural Language Toolkit(自然语言工具包) &…...
项目日志配置模板示例
1.新增application.properties配置 logging.configclasspath:logback-spring.xml spring.profiles.activedev 将项目部署到服务器时需要将dev修改为test后再进行打包部署 2.新增logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <…...
sql server统计小时数据中每日最大风速及风速对应的风向
客户提出一个需求,有历年逐小时的风速、风向资料,想获取历年最大的风速及风速对应的风向值,通过sql 怎么实现,这个统计,我认为主要考虑一个问题,就是数据重复性,所以我采用以下方法实现…...
【SQL】MySql常见的性能优化方式
MySQL性能优化的常用方式及对比说明 一、引言二、MySQL性能优化的常用方式及对比说明1. 索引优化1.1 合理创建索引1.2 覆盖索引1.3 索引下推 2. SQL语法优化2.1 避免低效操作2.2 分页优化2.3 JOIN优化 3. 配置与架构优化3.1 参数调优3.2 读写分离与分库…...
Prometheus实现负载均衡并将多个实例数据汇总到一个主Prometheus
一、Prometheus实现负载均衡策略原理 要实现 Prometheus 的负载均衡并将多个 Prometheus 实例的数据汇总到一个主 Prometheus 实例中,可以结合 Prometheus 联邦(Federation) 和 负载均衡器 来进行配置。 这种方法的核心是在主 Prometheus 实例…...
力扣 — — 最长公共子序列
力扣 — — 最长公共子序列 最长公共子序列 题源:1143. 最长公共子序列 - 力扣(LeetCode) 题目: 分析: 一道经典的题目:最长公共子序列(LCS) 题目大意:求两个字符串的最长公共序列。 算法&…...
通过AWS EKS 生成并部署容器化应用
今天给大家分享一个实战例子,如何在EKS上创建容器化应用并通过ALB来发布。先介绍一下几个基本概念: IAM, OpenID Connect (OIDC) 2014 年,AWS Identity and Access Management 增加了使用 OpenID Connect (OIDC) 的联合身份支持。此功能允许…...
GNSS静态数据处理
1 安装数据处理软件:仪器之星(InStar )和 Trimble Business Center 做完控制点静态后,我们需要下载GNSS数据,对静态数据进行处理。在处理之前需要将相关软件在自己电脑上安装好: 仪器之星(InS…...
NVIDIA H100 vs A100:新一代GPU架构性能对比分析
一、核心架构演进对比 Ampere架构(A100)采用台积电7nm工艺,集成540亿晶体管,配备6,912个CUDA核心和432个第三代Tensor Core,支持FP16、TF32和INT8精度计算。其显存子系统采用HBM2e技术,80GB版本带宽可…...