首页 / 技术专题CATEGORY / SPRINGFORALL

Spring

在这个技术方向,积累扎实的知识与实践。

共 580 篇文章

Spring Boot 4.1 用 InetAddressFilter 防 SSRF,RestClient 异常类型随底层客户端而变

用 Spring Boot 4.1.1 的 InetAddressFilter.externalAddresses() 实测 JDK、Apache、Jetty、Reactor Netty 四种底层客户端:回环、元数据、内网和十进制地址全部被拦,公网 IP 正常放行;RestClient 抛出的异常却分成裸 FilteredHostException 和 ResourceAccessException 两种,fake-ip DNS 下所有域名也会一并被拦。

把 Spring Boot 3.5 项目升到 4.1,classic starter 带进的 gRPC 会让 Security 应用起不来

把一个 Web、JPA、Security、Actuator、Validation 的 Spring Boot 3.5.16 项目升到 4.1.1,每步一个 git 提交:主代码不用改,测试切片和 TestRestTemplate 换了包,@MockBean 已删。4.1.1 的 spring-boot-starter-classic 会带进 spring-boot-grpc-server 却不带 Spring gRPC,CSRF 没关的 Security 应用启动即报 NoClassDefFoundError,4.0.8 没有这个问题,排除该模块即可。换成模块化 starter 时,只引 spring-security-test 会让 @WebMvcTest 里没有 HttpSecurity。

Spring Boot 4.1 接 NullAway 的 JSpecify 模式,漏报的空指针全在 JDK 和 Jackson 上

在 Spring Boot 4.1.1 项目里写了 17 处不判空的调用,接上 Error Prone 2.50.0 和 NullAway 0.14.2 实测:JSpecify 模式报 12 个错误,Spring API 上直接标 @Nullable 的返回值全部拦下;List.get、System.getProperty、HashMap.put 和 RowMapper 里的 ResultSet.getString 要加 JSpecifyExperimental 才报,Jackson 的 JsonNode.get 始终漏网。JDK 21 上要配 .mvn/jvm.config 和 -XDaddTypeAnnotationsToSymbol=true,编译耗时中位数从 2248 ms 到 4139 ms。

Spring Security 的通行密钥默认存在内存里,应用一重启就得重新注册:7.1 上换 JDBC 实测

Spring Security 从 6.4 引入通行密钥起就默认把凭证存在内存里,重启后同一把密钥登录返回 401。在 Boot 4.1.1(Security 7.1.1)上用 Chrome 虚拟认证器实测:换成两个 JDBC 仓库后重启照常登录,官方建表脚本第二次启动会报表已存在;和密码组成 MFA 时要用 7.1 的 WEBAUTHN_REGISTERED 条件,否则没注册过的用户进不了注册页。