Filter与Listener(过滤器与监听器)
1.Filter
1.过滤器概述
过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener
它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作
在程序中访问服务器资源时,当一个请求到来,服务器首先判断是否有过滤器与请求资源相关联,如果有,过滤器可以将请求拦截下来,完成一些特定的功能,再由过滤器决定是否交给请求资源。如果没有则像之前那样直接请求资源了。响应也是类似的
过滤器一般用于完成通用的操作,例如:登录验证、统一编码处理、敏感字符过滤等
2.Filter概述
Filter 是一个接口,如果想实现过滤器的功能,必须实现该接口
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | init(FilterConfig config) | 初始化方法 |
| void | doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) | 对请求资源和响应资源过滤 |
| void | destory() | 销毁方法 |
配置方式
注解方式
配置文件
3.FilterChain
FilterChain 是一个接口,代表过滤器链对象。由 Servlet 容器提供实现类对象,直接使用即可。
过滤器可以定义多个,就会组成过滤
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | doFilter(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类似
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| String | getFilterName() | 获取过滤器对象名称 |
| String | getInitParameter(String key) | 根据key过去value |
| Enumeration | getInitParameterNames() | 获所有参数的key |
| ServletContext | getServletContext() | 获取应用上下文对象 |
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 对象的创建和销毁
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | contextInitialized(ServletContextEvent sce) | 对象创建时执行该方法 |
| void | contextDestroyed(ServletContextEvent sce) | 对象销毁时执行该方法 |
参数:ServletContextEvent 代表事件对象
事件对象中封装了事件源,也就是 ServletContext
真正的事件指的是创建或销毁 ServletContext 对象的操作
2.HttpSessionListener:用于监听 HttpSession 对象的创建和销毁
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | sessionCreated(HttpSessionEvent se) | 对象创建时执行该方法 |
| void | sessionDestroyed(HttpSessionEvent se) | 对象销毁时执行该方法 |
参数:HttpSessionEvent 代表事件对象
事件对象中封装了事件源,也就是 HttpSession
真正的事件指的是创建或销毁 HttpSession 对象的操作
3.ServletRequestListener:用于监听 ServletRequest 对象的创建和销毁
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | requestInitialized(ServletRequestEvent sre) | 对象创建时执行该方法 |
| void | requestDestroyed(ServletRequestEvent sre) | 对象销毁时执行该方法 |
参数:ServletRequestEvent 代表事件对象
事件对象中封装了事件源,也就是 ServletRequest
真正的事件指的是创建或销毁 ServletRequest 对象的操作
3.监听域对象属性变化的监听器
1.ServletContextAttributeListener:用于监听 ServletContext 应用域中属性的变化
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | attributeAdded(ServletContextAttributeEvent scae) | 域中添加属性时执行该方法 |
| void | attributeRemoved(ServletContextAttributeEvent scae) | 域中移除属性时执行该方法 |
| void | attributeReplaced(ServletContextAttributeEvent scae) | 域中替换属性时执行该方法 |
参数:ServletContextAttributeEvent 代表事件对象
事件对象中封装了事件源,也就是 ServletContext
真正的事件指的是添加、移除、替换应用域中属性的操作
2.HttpSessionAttributeListener:用于监听 HttpSession 会话域中属性的变化
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | attributeAdded(ServletSessionBindingEvent se) | 域中添加属性时执行该方法 |
| void | attributeRemoved(ServletSessionBindingEvent se) | 域中移除属性时执行该方法 |
| void | attributeReplaced(ServletSessionBindingEvent se) | 域中替换属性时执行该方法 |
参数:HttpSessionBindingEvent 代表事件对象
事件对象中封装了事件源,也就是 HttpSession
真正的事件指的是添加、移除、替换会话域中属性的操作
3.ServletRequestAttributeListener:用于监听 ServletRequest 请求域中属性的变化
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | attributeAdded(ServletRequestAttributeEvent srae) | 域中添加属性时执行该方法 |
| void | attributeRemoved(ServletRequestAttributeEvent srae) | 域中移除属性时执行该方法 |
| void | attributeReplaced(ServletRequestAttributeEvent srae) | 域中替换属性时执行该方法 |
参数:ServletRequestAttributeEvent 代表事件对象
事件对象中封装了事件源,也就是 ServletRequest
真正的事件指的是添加、移除、替换请求域中属性的操作
4.监听会话相关的感知性监听器
1.HttpSessionBindingListener:用于感知对象和会话域绑定的监听器
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | valueBound(HttpSessionBindingEvent event) | 数据添加到会话域中(绑定时)执行该方法 |
| void | valueUnbound(HttpSessionBindingEvent event) | 数据从会话域中移除(解绑时)执行该方法 |
参数:HttpSessionBindingEvent 代表事件对象
事件对象中封装了事件源,也就是 HttpSession
真正的事件指的是添加、移除会话域中数据的操作
2.HttpSessionActivationListener:用于感知会话域中对象钝化和活化的监听器
核心方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| void | sessionWillPassivate(HttpSessionEvent se) | 会话域中数据钝化时执行该方法 |
| void | sessionDidActivate(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,它是JavaWeb三大组件之一。另外两个是Servlet和Listener 它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作 在程序中访问服务器资源时,当一个请求到来,服务器首…...
【刷题篇】反转链表
文章目录 一、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语言小游戏,下…...
Vue计算属性computed和监听watch
1.计算属性 初衷:为了解决模块里面有太多的计算逻辑让模版难以维护。 计算属性可以依赖一个数据也可以依赖多个数据的变化 使用场景: 商品单价和数量改变时,商品总价更改。如果写在方法里面,那么每次修改商品单价和数量时都会…...
HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码
一、HTTP介绍二、HTTP工作原理HTTP三点注意事项 三、HTTP消息结构四、客户端请求消息五、服务器响应消息HTTP请求方法 七、HTTP响应头信息八、HTTP状态码(HTTP Status Code)下面是常见的HTTP状态码:HTTP状态码分类HTTP状态码列表 一、HTTP介绍…...
linux性能分析(五)如何学习linux性能优化
一 如何学习linux性能优化 强调: 由于知识记忆曲线以及某些知识点不常用,所以一定要注重复习思考: 如何进行能力转义以及能力嫁接? --> 真正站在巨人的肩膀上性能调优的目的: 不影响系统稳定性的资源最大利用化补充: 性能…...
1402. 做菜顺序 --力扣 --JAVA
题目 一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间(包含之前每道菜所花费的时间)乘以这道菜的满意程度,也就是 time[i…...
Springboot踩坑-request body重复读问题
背景 在一次业务开发中,由于需要在拦截器中对一个http请求中request body内容做解析和判断,所以用了httpServletRequest的getInputStream解析了request body内容,之后导致了拦截器处理成功后,原来的业务接口处报request body not…...
C++ 类和对象(六)赋值运算符重载
1 运算符重载 C为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数, 也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为:关键字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自动扩缩容 举例配置 基于请求数(次/秒) 指标实现pod自动扩缩容 举例配置 基于 http请求响应时间 (ms) 指标实现pod自动扩缩容 举例配置 基于 Java GC暂停时间 (ms) 指标实现…...
深、浅拷贝之间的关系
深、浅拷贝之间的关系 什么是赋值 赋值是将某一数值或对象赋给某个变量的过程,分为下面 2 部分 基本数据类型:赋值,赋值之后两个变量互不影响引用数据类型:赋址,两个变量具有相同的引用,指向同一个对象&…...
服务器数据恢复-某银行服务器硬盘数据恢复案例
服务器故障&分析: 某银行的某一业务模块崩溃,无法正常使用。排查服务器故障,发现运行该业务模块的服务器中多块硬盘离线,导致上层应用崩溃。 故障服务器内多块硬盘掉线,硬盘掉线数量超过服务器raid阵列冗余级别所允…...
仪器器材经营小程序商城的作用是什么
互联网发展下,数字化转型已经成为常态,仅依赖传统线下经营模式将很难再增长。 作为产品销售及客户维护度高的仪器器材行业,拥有自营商城平台是必要的,不仅可以解决以上难题,还利于打造自身品牌多渠道传播,…...
京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!
鲸参谋监测的京东平台9月份洗烘套装市场销售数据已出炉! 根据鲸参谋平台的数据显示,今年9月份,京东平台洗烘套装的销量为7100,环比下降约37%,同比增长约87%;销售额为6000万,环比下降约48%&#…...
论文阅读-多目标强化学习-envelope MOQ-learning
introduction 一种多目标强化学习算法,来自2019 Nips《A Generalized Algorithm for Multi-Objective Reinforcement Learning and Policy Adaptation》本文引用代码全部来源于论文中的链接。主要参考run_e3c_double.py文件 1 总体思想 1.将输入中加入多目标的偏…...
【原创】【考法总结】指针*与++结合的题目考法总结
代码均已调试出结果,放心食用,大致总共5种考法 【理论铺垫】①a[i]恒等价于(ai)即*(&a[0]i);i类似偏移量(别忘a代表数组首元素地址即&a[0]) ②*(&a[i])恒等价于a[i]:&a[i]表示a[i]的地址&a…...
react dispatch不生效的坑
一、前言 最近写react antd项目,在A页面中使用了dispatch方法,然后B页面中嵌套A页面,没有问题; 但是在C页面中嵌套A页面的时候,就发现dispatch方法没有执行,也不报错,就很奇怪; 还…...
Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly
安装c语言编译器的时候,老是出现The file has been downloaded incorrectly,真的让人 直接去官网拿压缩包:https://sourceforge.net/projects/mingw-w64/files/ (往下拉找到那个x86_64-win32-seh的链接,点击后会自动…...
OpenGL —— 2.6、绘制一个正方体并贴图(附源码,glfw+glad)
源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _viewMatrix; u…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
