SpringBoot拦截器失效?你可能漏了WebMvcConfigurationSupport这个关键配置
SpringBoot拦截器失效你可能漏了WebMvcConfigurationSupport这个关键配置最近在帮团队排查一个线上问题时遇到了一个典型的SpringBoot拦截器失效的案例。一位同事信誓旦旦地说拦截器已经配置好了日志也打了但请求进来就是不走拦截器里的逻辑。我过去一看代码写得挺规范HandlerInterceptor接口实现得也没毛病但问题就出在一个不起眼的配置类继承关系上——他为了处理静态资源映射直接继承了WebMvcConfigurationSupport却忘了重写那个关键的addInterceptors方法。这个坑不少中级开发者都踩过今天我们就来彻底理清这里面的门道。SpringBoot的自动配置固然方便但当我们想要深度定制Web MVC行为时比如添加自定义拦截器、配置资源处理器、解决跨域问题就不可避免地要介入到配置层面。这时WebMvcConfigurationSupport这个类就成了一个分水岭。用对了它能让你对Spring MVC的配置拥有完全的控制权用错了或者用漏了就会导致一系列“灵异”事件其中最常见的就是拦截器“神秘”失效。这篇文章就是为你准备的排坑指南我们会从原理到实践一步步拆解为什么拦截器会失效以及如何正确使用WebMvcConfigurationSupport来确保你的定制化配置生效。1. 拦截器失效的根源自动配置的“静默”覆盖要理解为什么拦截器会失效我们得先看看SpringBoot在启动时关于Web MVC这块都做了些什么。很多开发者以为只要写一个Configuration类在里面通过Bean方式注册一个拦截器就万事大吉了但实际上SpringBoot的自动配置逻辑远比这复杂。1.1 SpringBoot自动配置的“开关”机制SpringBoot的核心魅力在于“约定大于配置”。对于Web MVC其自动配置的入口通常是WebMvcAutoConfiguration这个类。这个类内部定义了一系列条件化的Bean其中一个关键条件就是当你的应用上下文中不存在WebMvcConfigurationSupport类型的Bean时这些自动配置才会生效。// 这是一个简化的逻辑示意非源码直接拷贝 Configuration(proxyBeanMethods false) ConditionalOnWebApplication(type Type.SERVLET) ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) // 关键条件当没有WebMvcConfigurationSupport类型的Bean时自动配置才生效 ConditionalOnMissingBean(WebMvcConfigurationSupport.class) AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE 10) AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration { // ... 自动配置的内容包括拦截器、资源处理器、视图解析器等 }这个ConditionalOnMissingBean(WebMvcConfigurationSupport.class)注解就是问题的核心。一旦你在项目中定义了一个继承自WebMvcConfigurationSupport的配置类并且被Spring扫描到这个条件就不再满足WebMvcAutoConfiguration类中的绝大部分自动配置就会完全失效。注意这里说的“失效”是指SpringBoot提供的那套默认的、便利的Web MVC配置不起作用了。取而代之的是需要你通过继承WebMvcConfigurationSupport来手动提供所有必要的配置。1.2 手动配置与自动配置的冲突场景很多开发者引入WebMvcConfigurationSupport的初衷往往是为了解决一两个具体问题比如静态资源路径映射默认的/static、/public等路径不满足需求需要自定义。跨域配置CORS需要更精细化的跨域策略。视图控制器快速定义一些简单的URL到视图的映射。于是他们创建了这样一个配置类Configuration public class MyWebConfig extends WebMvcConfigurationSupport { Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { // 自定义静态资源映射 registry.addResourceHandler(/my-resources/**) .addResourceLocations(classpath:/my-static/); } Override public void addCorsMappings(CorsRegistry registry) { // 自定义跨域配置 registry.addMapping(/api/**) .allowedOrigins(https://trusted-domain.com); } }写完这个类他们可能觉得大功告成资源能访问了跨域也解决了。然后他们又通过另一个配置类或者直接在MyWebConfig里尝试添加拦截器却发现拦截器怎么都不生效。原因就在于当你继承了WebMvcConfigurationSupport你就接管了整个Web MVC的配置责任。如果你没有明确重写addInterceptors方法那么拦截器注册的“通道”根本就没有被建立起来。下表清晰地对比了两种配置方式下关键组件的配置来源配置组件使用自动配置 (WebMvcAutoConfiguration)继承WebMvcConfigurationSupport拦截器注册可通过WebMvcConfigurer接口的addInterceptors方法添加必须重写addInterceptors方法进行注册静态资源处理提供默认的/static,/public等路径映射默认映射失效必须重写addResourceHandlers方法自定义跨域配置可通过WebMvcConfigurer接口的addCorsMappings方法添加必须重写addCorsMappings方法进行配置视图控制器无默认配置可通过WebMvcConfigurer添加必须重写addViewControllers方法进行配置配置责任SpringBoot主导开发者补充开发者全权负责需手动配置所有需要的组件从这个对比可以看出继承WebMvcConfigurationSupport是一把双刃剑。它给了你最大的控制权但也把配置的完整性和正确性的责任完全交给了你。任何一个必要的配置方法被遗漏都可能导致相应的功能缺失。2. 正确配置拦截器的两种核心路径既然知道了问题的根源解决方案就清晰了。根据你是否需要完全接管Web MVC配置有两种主流的、正确的拦截器配置方式。2.1 路径一推荐多数场景——实现WebMvcConfigurer接口如果你的定制需求仅限于添加拦截器、配置跨域、添加格式化器等并不需要完全覆盖SpringBoot的默认静态资源处理等行为那么实现WebMvcConfigurer接口是更安全、更推荐的方式。WebMvcConfigurer是一个接口它提供了多个默认方法Java 8特性允许你对Spring MVC的配置进行增量定制而不会导致自动配置完全失效。SpringBoot的WebMvcAutoConfiguration内部已经定义了一个WebMvcConfigurerBean来承载默认配置你的实现会与它协同工作。配置示例Configuration public class MyInterceptorConfig implements WebMvcConfigurer { Override public void addInterceptors(InterceptorRegistry registry) { // 注册自定义拦截器并指定拦截路径 registry.addInterceptor(new MyCustomInterceptor()) .addPathPatterns(/api/**) // 拦截所有/api开头的请求 .excludePathPatterns(/api/public/**, /error); // 排除特定路径 // 可以注册多个拦截器执行顺序按添加顺序 registry.addInterceptor(new LoggingInterceptor()) .addPathPatterns(/**); } Override public void addCorsMappings(CorsRegistry registry) { // 同时配置跨域与拦截器配置共存 registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS); } }这种方式的核心优势无破坏性不会关闭SpringBoot的Web MVC自动配置。职责单一你只需要关心你想定制的部分。易于维护配置清晰不容易遗漏其他必要功能如静态资源访问。2.2 路径二需要完全控制时——继承WebMvcConfigurationSupport当你确实需要完全掌控Web MVC配置例如需要定义一套与SpringBoot默认规则完全不同的静态资源映射。项目历史遗留原因必须使用特定的配置方式。需要对HandlerMapping、HandlerAdapter等底层组件进行深度定制。这时你才应该选择继承WebMvcConfigurationSupport。但请务必记住这是一份“全权负责”的契约。一个完整且正确的配置类示例Configuration public class CompleteWebMvcConfig extends WebMvcConfigurationSupport { // 1. 注册拦截器这是解决失效问题的关键 Override public void addInterceptors(InterceptorRegistry registry) { // 将拦截器实例化为Bean方便管理生命周期和依赖注入 registry.addInterceptor(authInterceptor()) .addPathPatterns(/app/**) .excludePathPatterns(/app/login, /app/static/**); registry.addInterceptor(performanceInterceptor()) .addPathPatterns(/**); } // 通过Bean管理拦截器可以注入其他依赖 Bean public AuthInterceptor authInterceptor() { return new AuthInterceptor(); } Bean public PerformanceInterceptor performanceInterceptor() { return new PerformanceInterceptor(); } // 2. 配置静态资源映射必须否则默认的静态资源路径如/static将失效 Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { // 保留或覆盖默认的静态资源路径可选但建议明确指定 registry.addResourceHandler(/static/**) .addResourceLocations(classpath:/static/); // 添加自定义资源路径 registry.addResourceHandler(/assets/**) .addResourceLocations(classpath:/assets/, file:/opt/upload/); // 如果使用了Swagger等API文档工具也需要在这里配置其资源 registry.addResourceHandler(swagger-ui.html) .addResourceLocations(classpath:/META-INF/resources/); registry.addResourceHandler(/webjars/**) .addResourceLocations(classpath:/META-INF/resources/webjars/); } // 3. 配置跨域如果需要 Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/api/**) .allowedOrigins(https://your-frontend.com) .allowedMethods(GET, POST) .allowCredentials(true); } // 4. 其他可能需要重写的方法如视图解析、格式化等 // Override // public void configureMessageConverters(ListHttpMessageConverter? converters) {...} }关键点提醒拦截器Bean化建议将拦截器声明为Bean而不是在addInterceptors方法里直接new。这样拦截器本身也能被Spring容器管理可以方便地使用Autowired注入其他服务。资源映射是必须项一旦继承WebMvcConfigurationSupportaddResourceHandlers方法几乎总是需要重写的否则你的静态资源包括前端打包后的文件可能无法访问。注意配置顺序在addInterceptors方法中拦截器的执行顺序就是它们被添加到registry中的顺序。3. 高级排查技巧与常见陷阱即使按照上述方式配置了有时拦截器可能仍然表现怪异。下面是一些高级场景的排查点。3.1 拦截路径PathPattern的匹配规则拦截器是否生效首先看路径匹配。Spring MVC的路径匹配在近年来有重要变化。AntPathMatchervsPathPatternParserSpring Boot 2.x 早期版本默认使用AntPathMatcher而从**Spring Boot 2.6**开始默认改为PathPatternParser。后者性能更高但语法有细微差别例如**在PathPatternParser中不能用在路径中间。排查路径错误使用/**拦截所有请求通常没问题但如果你设置了更具体的模式如/api/*它只会匹配一层路径如/api/users不会匹配多层如/api/users/1。多层匹配需要用/api/**。一个快速的诊断方法是在拦截器的preHandle方法开始处打印请求的URIOverride public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { logger.info(拦截器触发请求URI: {}, request.getRequestURI()); // ... 你的业务逻辑 }如果这个日志根本没有输出说明拦截器根本没被注册到执行链中问题在配置层面。如果输出了但没走你的业务逻辑问题可能在路径匹配或拦截器内部的判断逻辑。3.2 拦截器与过滤器Filter的执行顺序混淆有些开发者会把Spring MVC的HandlerInterceptor和Servlet规范的Filter搞混。它们虽然都能拦截请求但属于不同层次执行时机和能获取的信息也不同。特性HandlerInterceptor (Spring MVC)Filter (Servlet)所属规范Spring MVC 框架Java Servlet 规范依赖依赖于Spring MVC的DispatcherServlet不依赖Spring是Servlet容器层面执行时机在DispatcherServlet内部请求被映射到具体Controller方法前后在DispatcherServlet之前和之后更底层可获取信息可以获取到将要执行的HandlerMethodController方法只能获取到ServletRequest和ServletResponse配置方式通过WebMvcConfigurer或WebMvcConfigurationSupport通过WebFilter注解或在FilterRegistrationBean中注册如果有一个Filter在链中调用了chain.doFilter(request, response)请求才会继续传递到DispatcherServlet进而才有可能被HandlerInterceptor拦截。如果Filter因为某些原因如权限校验失败直接返回了响应而没有调用doFilter那么请求根本到不了Interceptor这一层。排查时需要理清整个请求处理链。3.3 多个配置类的冲突与优先级在大型项目中可能有多个配置类试图影响Web MVC的配置。Order注解如果你有多个实现了WebMvcConfigurer的类可以使用Order注解值越小优先级越高来控制它们配置方法的执行顺序。这对于拦截器顺序、消息转换器顺序等场景很重要。继承冲突绝对要避免出现多个类继承WebMvcConfigurationSupport的情况。Spring容器中只能有一个WebMvcConfigurationSupport的Bean生效后定义的可能会覆盖先定义的行为不确定这会导致配置混乱。最佳实践是只有一个类继承WebMvcConfigurationSupport并将所有相关配置集中于此。EnableWebMvc的陷阱在Spring Boot项目中通常不需要也不应该使用EnableWebMvc注解。这个注解的作用是导入Spring MVC的默认配置而非Spring Boot的增强配置一旦使用效果类似于继承WebMvcConfigurationSupport会导致Spring Boot的Web MVC自动配置失效。除非你打算完全手动配置Spring MVC否则请远离它。4. 实战构建一个健壮的可配置化拦截器系统了解了原理和排错方法后我们来看一个更贴近生产环境的实战案例。我们将构建一个支持配置化、包含多个拦截器、并能优雅处理静态资源与API文档的Web MVC配置。4.1 定义可配置的拦截器首先我们创建一个权限验证拦截器但其拦截规则如排除的URL可以从配置文件如application.yml中读取增加灵活性。# application.yml myapp: interceptor: auth: exclude-paths: - /api/v1/public/login - /api/v1/public/register - /swagger-ui/** - /v3/api-docs/**Component public class AuthInterceptor implements HandlerInterceptor { Value(${myapp.interceptor.auth.exclude-paths}) private ListString excludePaths; // 注入排除路径列表 private final AntPathMatcher pathMatcher new AntPathMatcher(); Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestUri request.getRequestURI(); // 检查是否在排除路径中 for (String pattern : excludePaths) { if (pathMatcher.match(pattern, requestUri)) { return true; // 放行 } } // 执行实际的权限验证逻辑例如验证Token String token request.getHeader(Authorization); if (isValidToken(token)) { // 可以将用户信息存入请求属性供Controller使用 request.setAttribute(currentUser, extractUserFromToken(token)); return true; } else { response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.getWriter().write({\code\: 401, \message\: \Unauthorized\}); return false; } } private boolean isValidToken(String token) { /* ... */ } private User extractUserFromToken(String token) { /* ... */ } }4.2 集中式的WebMvc配置类接着我们创建一个继承自WebMvcConfigurationSupport的配置类但这次我们采用更模块化的方式并确保所有必要配置都已覆盖。Configuration Slf4j public class ProjectWebMvcConfig extends WebMvcConfigurationSupport { Autowired private AuthInterceptor authInterceptor; Autowired private LoggingInterceptor loggingInterceptor; Value(${spring.web.resources.static-locations:classpath:/static/}) private String[] staticLocations; Override public void addInterceptors(InterceptorRegistry registry) { // 日志拦截器拦截所有请求最先执行 registry.addInterceptor(loggingInterceptor) .addPathPatterns(/**) .order(Ordered.HIGHEST_PRECEDENCE); // 顺序值越小越先执行 // 权限拦截器拦截/app下的请求在日志拦截器之后执行 registry.addInterceptor(authInterceptor) .addPathPatterns(/app/**) .order(Ordered.HIGHEST_PRECEDENCE 10); log.info(自定义拦截器注册完成。); } Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { // 处理Spring Boot默认的静态资源路径从配置读取 String[] locations staticLocations.split(,); registry.addResourceHandler(/static/**) .addResourceLocations(locations) .setCachePeriod(3600); // 设置缓存时间 // 处理Swagger UI资源如果你使用了SpringDoc OpenAPI registry.addResourceHandler(swagger-ui.html) .addResourceLocations(classpath:/META-INF/resources/); registry.addResourceHandler(/webjars/**) .addResourceLocations(classpath:/META-INF/resources/webjars/); // 自定义前端构建产物路径 registry.addResourceHandler(/**) .addResourceLocations(classpath:/frontend-dist/) .resourceChain(true) .addResolver(new PathResourceResolver() { Override protected Resource getResource(String resourcePath, Resource location) throws IOException { Resource requestedResource location.createRelative(resourcePath); // 如果请求的资源不存在则返回前端应用的入口文件如index.html用于支持前端路由 return requestedResource.exists() requestedResource.isReadable() ? requestedResource : new ClassPathResource(/frontend-dist/index.html); } }); } Override public void addCorsMappings(CorsRegistry registry) { // 生产环境建议配置具体的源而不是“*” registry.addMapping(/api/**) .allowedOrigins(https://www.myapp.com, https://admin.myapp.com) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(1800L); // 预检请求缓存时间 } // 可选配置内容协商、消息转换器等 Override public void configureMessageConverters(ListHttpMessageConverter? converters) { // 添加Fastjson或Jackson的定制化配置 converters.add(new MappingJackson2HttpMessageConverter(customObjectMapper())); } Bean public ObjectMapper customObjectMapper() { ObjectMapper mapper new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss)); return mapper; } }这个配置类展示了几个生产级实践拦截器顺序控制使用order()方法明确指定执行顺序。灵活的静态资源处理既支持配置化的默认路径也支持前端单页应用SPA的路由回退fallback to index.html。安全的CORS配置避免使用过于宽松的allowedOrigins(*)特别是在生产环境。配置外部化将静态资源路径等可配置项放在application.yml中。4.3 验证与测试配置完成后如何验证拦截器是否按预期工作单元测试可以编写测试来验证InterceptorRegistry中是否包含了你的拦截器以及路径模式是否正确。集成测试使用MockMvc或TestRestTemplate发起HTTP请求断言拦截器逻辑是否生效例如未授权的请求返回401。运行时日志在拦截器的preHandle方法开始和结束处打上日志观察请求流。同时检查Spring Boot启动日志看是否有关于WebMvcConfigurationSupport的提示。最后记住一个核心原则在Spring Boot中做Web MVC定制优先选择实现WebMvcConfigurer接口进行增量配置除非你有非常充分的理由需要完全接管配置即继承WebMvcConfigurationSupport。如果选择了后者务必像核对清单一样检查是否重写了所有你需要的方法特别是addInterceptors和addResourceHandlers。

相关新闻

Qwen3-4B-Instruct-2507实战教程:添加敏感词过滤与合规输出审核模块

Qwen3-4B-Instruct-2507实战教程:添加敏感词过滤与合规输出审核模块

Qwen3-4B-Instruct-2507实战教程:添加敏感词过滤与合规输出审核模块 1. 项目概述与需求背景 Qwen3-4B-Instruct-2507是阿里通义千问推出的纯文本大语言模型,专注于文本处理场景,具有推理速度快、交互体验好的特点。在实际应用中&#xff0c…

2026/7/4 6:15:36 阅读更多 →
SOONet长短期记忆网络(LSTM)时序建模效果深度评测

SOONet长短期记忆网络(LSTM)时序建模效果深度评测

SOONet长短期记忆网络(LSTM)时序建模效果深度评测 视频理解,尤其是理解那些跨越数秒甚至数十秒的复杂动态,一直是AI领域的一大挑战。比如,在一段视频里,如何准确找到两个人从争吵到和解的完整对话片段&…

2026/7/4 6:15:34 阅读更多 →
BiliTools:B站资源获取全平台终极方案

BiliTools:B站资源获取全平台终极方案

BiliTools:B站资源获取全平台终极方案 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 还在…

2026/7/3 10:41:56 阅读更多 →

最新新闻

波峰焊虚焊问题分析与解决方案

波峰焊虚焊问题分析与解决方案

1. 波峰焊虚焊问题概述 虚焊是PCB波峰焊工艺中最常见的缺陷之一,它指的是焊料与被焊金属表面未能形成良好的冶金结合,导致电气连接不可靠或完全断开。这种现象在目检时往往难以发现,但在产品使用过程中会出现间歇性导通或完全开路&#xff0c…

2026/7/5 10:21:07 阅读更多 →
小型自动进给台钻设计与机械结构详解

小型自动进给台钻设计与机械结构详解

1. 小型自动进给台钻的设计背景与需求分析 在金属加工、木工制作和模型制作等领域,钻孔作业是最基础也最频繁的操作之一。传统手动台钻虽然结构简单,但在批量加工时存在效率低下、钻孔深度不一致等问题。自动进给机构的引入,能够显著提升加工…

2026/7/5 10:19:07 阅读更多 →
知识管理实战:从用户故事驱动KARL框架落地

知识管理实战:从用户故事驱动KARL框架落地

1. 项目概述:当知识管理不再只是IT部门的PPT工程我是Jim Glenn,在Six Feet Up担任KARL Champion——这个头衔听起来有点拗口,但它的实际含义很实在:我不是来写技术文档的,也不是来推动某个特定软件上线的,而…

2026/7/5 10:17:07 阅读更多 →
高速PCB信号完整性:眼图分析与工程实践

高速PCB信号完整性:眼图分析与工程实践

1. 高速PCB设计中的信号完整性挑战 在当今GHz级高速数字电路设计中,信号完整性问题已成为工程师面临的最大挑战之一。当信号速率超过5Gbps时,PCB走线上的传输线效应、阻抗不连续、串扰和抖动等问题会显著影响系统性能。我曾参与过一个25Gbps SerDes接口的…

2026/7/5 10:17:07 阅读更多 →
AI技能安全扫描实战:从威胁模型到CI/CD集成

AI技能安全扫描实战:从威胁模型到CI/CD集成

1. 项目概述:为什么AI技能也需要“安检门”?最近在折腾AI Agent和各类AI编程工具(比如Cursor、GitHub Copilot)时,我发现一个挺有意思的现象:大家热衷于分享和下载各种“技能”(Skills&#xff…

2026/7/5 10:17:07 阅读更多 →
3分钟解锁网易云音乐:NCM转MP3的完全免费解决方案

3分钟解锁网易云音乐:NCM转MP3的完全免费解决方案

3分钟解锁网易云音乐:NCM转MP3的完全免费解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经遇到过这样的尴尬:在网易云音乐下载了心爱的歌曲,却只能在特定App里播放?车…

2026/7/5 10:15:07 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻