当前位置: 首页 > news >正文

Filter与Listener(过滤器与监听器)

1.Filter

1.过滤器概述

过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener

它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作

在程序中访问服务器资源时,当一个请求到来,服务器首先判断是否有过滤器与请求资源相关联,如果有,过滤器可以将请求拦截下来,完成一些特定的功能,再由过滤器决定是否交给请求资源。如果没有则像之前那样直接请求资源了。响应也是类似的

过滤器一般用于完成通用的操作,例如:登录验证、统一编码处理、敏感字符过滤等

2.Filter概述

Filter 是一个接口,如果想实现过滤器的功能,必须实现该接口

核心方法

返回值方法名作用
voidinit(FilterConfig config)初始化方法
voiddoFilter(ServletRequest req,ServletResponse resp,FilterChain chain)对请求资源和响应资源过滤
voiddestory()销毁方法

 配置方式

        注解方式

        配置文件 

3.FilterChain

 FilterChain 是一个接口,代表过滤器链对象。由 Servlet 容器提供实现类对象,直接使用即可。

 过滤器可以定义多个,就会组成过滤

核心方法

返回值方法名作用
voiddoFilter(ServletRequest req,ServletResponse resp)放行方法

如果有多个过滤器,在第一个过滤器中调用下个过滤器,依次类推。直到到达最终访问资源

如果只有一个过滤器,放行时,就会直接到达最终访问资源

  

4.过滤器的使用 

需求说明

通过Filter过滤器解决多个资源写出中文乱码的问题

实现步骤

1.创建一个web项目

2.创建两个Servlet功能类,都向客户端写出中文数据

3.创建一个Filter过滤器实现类,重写doFilter核心方法

4.在方法内部解决中文乱码,并放行

5.部署并启动项目

6.通过浏览器测试

package filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/*过滤器基本使用
*/
@WebFilter("/*")
public class FilterDemo01 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo01执行了...");//处理乱码servletResponse.setContentType("text/html;charset=UTF-8");//放行filterChain.doFilter(servletRequest,servletResponse);}
}

5.过滤器的使用细节

配置方式

         注解方式 @WebFilter(拦截路径)

         配置文件

<filter><filter-name>filterDemo01</filter-name><filter-class>filter.FilterDemo01</filter-class>
</filter>
<filter-mapping><filter-name>filterDemo01</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

 多个过滤器使用顺序

如果有多个过滤器,取决于过滤器映射的顺序

也就是filter-mapping配置的先后顺序

6.过滤器的生命周期

 创建(出生)

当应用加载时实例化对象并执行 init 初始化方法

 服务(活着)

对象提供服务的过程,执行 doFilter 方法
​​​​​

只要应用一直提供服务,对象就一直存在

 销毁(死亡)

当应用卸载时或服务器停止时对象销毁。执行 destroy

Filter的实例对象在内存中也只有一份。所以也是单例的

package filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class FilterDemo03 implements Filter {//初始化方法@Overridepublic void init(FilterConfig filterConfig) {System.out.println("对象初始化成功了...");}//提供服务方法@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo03执行了...");//处理乱码servletResponse.setContentType("text/html;charset=UTF-8");//放行filterChain.doFilter(servletRequest,servletResponse);}//对象销毁@Overridepublic void destroy() {System.out.println("对象销毁了...");}
}

 web.xml

<filter><filter-name>filterDemo03</filter-name><filter-class>filter.FilterDemo03</filter-class></filter><filter-mapping><filter-name>filterDemo03</filter-name><url-pattern>/*</url-pattern></filter-mapping>

7.FilterConfig过滤器配置对象

FilterConfig 是一个接口。代表过滤器的配置对象,可以加载一些初始化参数。与ServletConfig类似

核心方法

返回值方法名作用
StringgetFilterName()获取过滤器对象名称
StringgetInitParameter(String key)根据key过去value
EnumerationgetInitParameterNames()获所有参数的key
ServletContextgetServletContext()获取应用上下文对象
package filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class FilterDemo04 implements Filter {//初始化方法@Overridepublic void init(FilterConfig filterConfig) {System.out.println("对象初始化成功了...");//获取过滤器名称String filterName = filterConfig.getFilterName();System.out.println(filterName);//根据name获取valueString username = filterConfig.getInitParameter("username");System.out.println(username);}//提供服务方法@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo04执行了...");//处理乱码servletResponse.setContentType("text/html;charset=UTF-8");//放行filterChain.doFilter(servletRequest,servletResponse);}//对象销毁@Overridepublic void destroy() {System.out.println("对象销毁了...");}
}

web.xml

 <filter><filter-name>filterDemo04</filter-name><filter-class>filter.FilterDemo04</filter-class><init-param><param-name>username</param-name><param-value>zhangsan</param-value></init-param></filter><filter-mapping><filter-name>filterDemo04</filter-name><url-pattern>/*</url-pattern></filter-mapping>

8.过滤器五种拦截行为 

Filter 过滤器默认拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,就需要我们配置

<filter><filter-name>filterDemo05</filter-name><filter-class>Filter.FilterDemo5</filter-class><!--配置开启异步支持,当dispatcher配置ASYNC时,需要配置此行--><async-supported>true</async-supported>
</filter>
<filter-mapping><filter-name>filterDemo05</filter-name><url-pattern>/index.jsp</url-pattern><!--过滤请求:默认值。--><dispatcher>REQUEST</dispatcher><!--过滤全局错误页面:当由服务器调用全局错误页面时,过滤器工作--><dispatcher>ERROR</dispatcher><!--过滤请求转发:当请求转发时,过滤器工作。--><dispatcher>FORWARD</dispatcher><!--过滤请求包含:当请求包含时,过滤器工作。它只能过滤动态包含,jsp的include指令是静态包含,过滤器不会起作用--><dispatcher>INCLUDE</dispatcher><!--过滤异步类型,它要求我们在filter标签中配置开启异步支持--><dispatcher>ASYNC</dispatcher>
</filter-mapping>

2.Listener 

1.监听器概述

观察者设计模式,所有的监听器都是基于观察者设计模式的

三个组成部分

事件源:触发事件的对象。

事件:触发的动作,里面封装了事件源。

监听器:当事件源触发事件时,要做的事情。一般是一个接口,由使用者来实现。

监听器:

在程序当中,我们可以对:对象的创建销毁、域对象中属性的变化、会话相关内容进行监听

Servlet 规范中共计 8 个监听器,监听器都是以接口形式提供,具体功能需要我们自己来完成

2.监听对象的监听器

1.ServletContextListener:用于监听 ServletContext 对象的创建和销毁

核心方法

返回值方法名作用
voidcontextInitialized(ServletContextEvent sce)对象创建时执行该方法
voidcontextDestroyed(ServletContextEvent sce)对象销毁时执行该方法

参数:ServletContextEvent 代表事件对象

事件对象中封装了事件源,也就是 ServletContext

真正的事件指的是创建或销毁 ServletContext 对象的操作

2.HttpSessionListener:用于监听 HttpSession 对象的创建和销毁

核心方法

返回值方法名作用
voidsessionCreated(HttpSessionEvent se)对象创建时执行该方法
voidsessionDestroyed(HttpSessionEvent se)对象销毁时执行该方法

参数:HttpSessionEvent 代表事件对象

事件对象中封装了事件源,也就是 HttpSession

真正的事件指的是创建或销毁 HttpSession 对象的操作

3.ServletRequestListener:用于监听 ServletRequest 对象的创建和销毁

核心方法

返回值方法名作用
voidrequestInitialized(ServletRequestEvent sre)对象创建时执行该方法
voidrequestDestroyed(ServletRequestEvent sre)对象销毁时执行该方法

参数:ServletRequestEvent 代表事件对象

事件对象中封装了事件源,也就是 ServletRequest

真正的事件指的是创建或销毁 ServletRequest 对象的操作

3.监听域对象属性变化的监听器

1.ServletContextAttributeListener:用于监听 ServletContext 应用域中属性的变化

核心方法

返回值方法名作用
voidattributeAdded(ServletContextAttributeEvent scae)域中添加属性时执行该方法
voidattributeRemoved(ServletContextAttributeEvent scae)域中移除属性时执行该方法
voidattributeReplaced(ServletContextAttributeEvent scae)域中替换属性时执行该方法

参数:ServletContextAttributeEvent 代表事件对象

事件对象中封装了事件源,也就是 ServletContext

真正的事件指的是添加、移除、替换应用域中属性的操作

2.HttpSessionAttributeListener:用于监听 HttpSession 会话域中属性的变化

核心方法

返回值方法名作用
voidattributeAdded(ServletSessionBindingEvent se)域中添加属性时执行该方法
voidattributeRemoved(ServletSessionBindingEvent se)域中移除属性时执行该方法
voidattributeReplaced(ServletSessionBindingEvent se)域中替换属性时执行该方法

参数:HttpSessionBindingEvent 代表事件对象

事件对象中封装了事件源,也就是 HttpSession

真正的事件指的是添加、移除、替换会话域中属性的操作

3.ServletRequestAttributeListener:用于监听 ServletRequest 请求域中属性的变化

核心方法

返回值方法名作用
voidattributeAdded(ServletRequestAttributeEvent srae)域中添加属性时执行该方法
voidattributeRemoved(ServletRequestAttributeEvent srae)域中移除属性时执行该方法
voidattributeReplaced(ServletRequestAttributeEvent srae)域中替换属性时执行该方法

参数:ServletRequestAttributeEvent 代表事件对象

事件对象中封装了事件源,也就是 ServletRequest

真正的事件指的是添加、移除、替换请求域中属性的操作

4.监听会话相关的感知性监听器

1.HttpSessionBindingListener:用于感知对象和会话域绑定的监听器

核心方法

返回值方法名作用
voidvalueBound(HttpSessionBindingEvent event)数据添加到会话域中(绑定时)执行该方法
voidvalueUnbound(HttpSessionBindingEvent event)数据从会话域中移除(解绑时)执行该方法

参数:HttpSessionBindingEvent 代表事件对象

事件对象中封装了事件源,也就是 HttpSession

真正的事件指的是添加、移除会话域中数据的操作

2.HttpSessionActivationListener:用于感知会话域中对象钝化和活化的监听器

核心方法

返回值方法名作用
voidsessionWillPassivate(HttpSessionEvent se)会话域中数据钝化时执行该方法
voidsessionDidActivate(HttpSessionEvent se)会话域中数据活化时执行该方法

参数:HttpSessionEvent 代表事件对象

事件对象中封装了事件源,也就是 HttpSession

真正的事件指的是会话域中数据钝化、活化的操作

5.监听器的使用

在实际开发中,我们可以根据具体情况来从这8个监听器中选择使用

感知型监听器由于无需配置,只需要根据实际需求编写代码

ServletContextListener

package listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;/*ServletContext对象的创建和销毁的监听器//配置监听器:@WebListener*/
@WebListener
public class ServletContextListenerDemo implements ServletContextListener {/*ServletContext对象创建的时候执行此方法*/@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("监听到了对象的创建...");//获取对象ServletContext servletContext = sce.getServletContext();System.out.println(servletContext);}/*ServletContext对象销毁的时候执行此方法*/@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("监听到了对象的销毁...");}
}

ServletContextAttributeListener

package listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;/*应用域对象中的属性变化的监听器*/
@WebListener
public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener {/*向应用域对象中添加属性时执行此方法*/@Overridepublic void attributeAdded(ServletContextAttributeEvent scae) {System.out.println("监听到了属性的添加...");//获取应用域对象ServletContext servletContext = scae.getServletContext();//获取属性Object value = servletContext.getAttribute("username");System.out.println(value);}/*向应用域对象中替换属性时执行此方法*/@Overridepublic void attributeReplaced(ServletContextAttributeEvent scae) {System.out.println("监听到了属性的替换...");//获取应用域对象ServletContext servletContext = scae.getServletContext();//获取属性Object value = servletContext.getAttribute("username");System.out.println(value);}/*向应用域对象中移除属性时执行此方法*/@Overridepublic void attributeRemoved(ServletContextAttributeEvent scae) {System.out.println("监听到了属性的移除...");//获取应用域对象ServletContext servletContext = scae.getServletContext();//获取属性Object value = servletContext.getAttribute("username");System.out.println(value);}
}

修改ServletContextListenerDemo:在contextInitialized中增加

//添加属性
servletContext.setAttribute("username","zhangsan");//替换属性
servletContext.setAttribute("username","lisi");//移除属性
servletContext.removeAttribute("username");

 

用配置文件方式(第一种为注解方式)

<?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"><!--配置监听器--><listener><listener-class>listener.ServletContextListenerDemo</listener-class></listener><listener><listener-class>listener.ServletContextAttributeListenerDemo</listener-class></listener>
</web-app>

相关文章:

Filter与Listener(过滤器与监听器)

1.Filter 1.过滤器概述 过滤器——Filter&#xff0c;它是JavaWeb三大组件之一。另外两个是Servlet和Listener 它可以对web应用中的所有资源进行拦截&#xff0c;并且在拦截之后进行一些特殊的操作 在程序中访问服务器资源时&#xff0c;当一个请求到来&#xff0c;服务器首…...

【刷题篇】反转链表

文章目录 一、206.反转链表二、92.反转链表 ||三、25. K 个一组翻转链表 一、206.反转链表 class Solution { public://使用头插//三个指针也可以ListNode* reverseList(ListNode* head) {if(headnullptr)return nullptr;ListNode* curhead;ListNode* newheadnew ListNode(0);L…...

【C语言小游戏--猜数字】

文章目录 前言1.游戏描述2.代码实现2.1打印菜单2.2构建基础框架2.3玩游戏2.3.1生成随机数2.3.1.1rand()2.3.1.2srand()2.3.1.3time() 2.3.2game() 2.4自己设定猜的次数 3.完整代码 前言 猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏&#xff0c;下…...

Vue计算属性computed和监听watch

1.计算属性 初衷&#xff1a;为了解决模块里面有太多的计算逻辑让模版难以维护。 计算属性可以依赖一个数据也可以依赖多个数据的变化 使用场景&#xff1a; 商品单价和数量改变时&#xff0c;商品总价更改。如果写在方法里面&#xff0c;那么每次修改商品单价和数量时都会…...

HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码

一、HTTP介绍二、HTTP工作原理HTTP三点注意事项 三、HTTP消息结构四、客户端请求消息五、服务器响应消息HTTP请求方法 七、HTTP响应头信息八、HTTP状态码&#xff08;HTTP Status Code&#xff09;下面是常见的HTTP状态码&#xff1a;HTTP状态码分类HTTP状态码列表 一、HTTP介绍…...

linux性能分析(五)如何学习linux性能优化

一 如何学习linux性能优化 强调&#xff1a; 由于知识记忆曲线以及某些知识点不常用,所以一定要注重复习思考&#xff1a; 如何进行能力转义以及能力嫁接? --> 真正站在巨人的肩膀上性能调优的目的&#xff1a; 不影响系统稳定性的资源最大利用化补充&#xff1a; 性能…...

1402. 做菜顺序 --力扣 --JAVA

题目 一个厨师收集了他 n 道菜的满意程度 satisfaction &#xff0c;这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间&#xff08;包含之前每道菜所花费的时间&#xff09;乘以这道菜的满意程度&#xff0c;也就是 time[i…...

Springboot踩坑-request body重复读问题

背景 在一次业务开发中&#xff0c;由于需要在拦截器中对一个http请求中request body内容做解析和判断&#xff0c;所以用了httpServletRequest的getInputStream解析了request body内容&#xff0c;之后导致了拦截器处理成功后&#xff0c;原来的业务接口处报request body not…...

C++ 类和对象(六)赋值运算符重载

1 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c; 也具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键字operator后面接需…...

rust学习-trait std::cmp::PartialEq、Eq、PartialOrd、Ord

PartialEq 介绍 pub trait PartialEq<Rhs = Self> whereRhs: ?Sized, {// Required method,后文有讲解这个注释fn eq(&self, other: &Rhs) -> bool;// Provided method,后文有讲解这个注释fn ne(&self, other: &Rhs) -> bool {... } }x.eq(y)…...

k8s pod根据指标自动扩缩容举例

目录 基于 内存 指标实现pod自动扩缩容 举例配置 基于 cpu 指标实现pod自动扩缩容 举例配置 基于请求数&#xff08;次/秒&#xff09; 指标实现pod自动扩缩容 举例配置 基于 http请求响应时间 (ms) 指标实现pod自动扩缩容 举例配置 基于 Java GC暂停时间 (ms) 指标实现…...

深、浅拷贝之间的关系

深、浅拷贝之间的关系 什么是赋值 赋值是将某一数值或对象赋给某个变量的过程&#xff0c;分为下面 2 部分 基本数据类型&#xff1a;赋值&#xff0c;赋值之后两个变量互不影响引用数据类型&#xff1a;赋址&#xff0c;两个变量具有相同的引用&#xff0c;指向同一个对象&…...

服务器数据恢复-某银行服务器硬盘数据恢复案例

服务器故障&分析&#xff1a; 某银行的某一业务模块崩溃&#xff0c;无法正常使用。排查服务器故障&#xff0c;发现运行该业务模块的服务器中多块硬盘离线&#xff0c;导致上层应用崩溃。 故障服务器内多块硬盘掉线&#xff0c;硬盘掉线数量超过服务器raid阵列冗余级别所允…...

仪器器材经营小程序商城的作用是什么

互联网发展下&#xff0c;数字化转型已经成为常态&#xff0c;仅依赖传统线下经营模式将很难再增长。 作为产品销售及客户维护度高的仪器器材行业&#xff0c;拥有自营商城平台是必要的&#xff0c;不仅可以解决以上难题&#xff0c;还利于打造自身品牌多渠道传播&#xff0c;…...

京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!

鲸参谋监测的京东平台9月份洗烘套装市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年9月份&#xff0c;京东平台洗烘套装的销量为7100&#xff0c;环比下降约37%&#xff0c;同比增长约87%&#xff1b;销售额为6000万&#xff0c;环比下降约48%&#…...

论文阅读-多目标强化学习-envelope MOQ-learning

introduction 一种多目标强化学习算法&#xff0c;来自2019 Nips《A Generalized Algorithm for Multi-Objective Reinforcement Learning and Policy Adaptation》本文引用代码全部来源于论文中的链接。主要参考run_e3c_double.py文件 1 总体思想 1.将输入中加入多目标的偏…...

【原创】【考法总结】指针*与++结合的题目考法总结

代码均已调试出结果&#xff0c;放心食用&#xff0c;大致总共5种考法 【理论铺垫】①a[i]恒等价于(ai)即*(&a[0]i)&#xff1b;i类似偏移量&#xff08;别忘a代表数组首元素地址即&a[0]&#xff09; ②*(&a[i])恒等价于a[i]&#xff1a;&a[i]表示a[i]的地址&a…...

react dispatch不生效的坑

一、前言 最近写react antd项目&#xff0c;在A页面中使用了dispatch方法&#xff0c;然后B页面中嵌套A页面&#xff0c;没有问题&#xff1b; 但是在C页面中嵌套A页面的时候&#xff0c;就发现dispatch方法没有执行&#xff0c;也不报错&#xff0c;就很奇怪&#xff1b; 还…...

Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly

安装c语言编译器的时候&#xff0c;老是出现The file has been downloaded incorrectly&#xff0c;真的让人 直接去官网拿压缩包&#xff1a;https://sourceforge.net/projects/mingw-w64/files/ &#xff08;往下拉找到那个x86_64-win32-seh的链接&#xff0c;点击后会自动…...

OpenGL —— 2.6、绘制一个正方体并贴图(附源码,glfw+glad)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库&#xff0c;该库只有一个头文件。 具体代码&#xff1a; vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _viewMatrix; u…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...