Java Spring介绍及安全防范

什么是Spring Framework

Spring 框架经历了从传统企业级开发到现代云原生、响应式编程的演变,每个大版本都在配置简化、性能提升、技术集成等方面持续创新。

随着Spring 生态系统庞大,适合各种规模和类型的Java应用开发框架也逐渐产生,而Spring Framework 都属于 Spring 生态的重要组成部分,它是一个功能强大且全面的 Java 企业级应用开发框架,通过提供 IoC(控制反转)和 AOP(面向切面编程)等核心特性,构建出松耦合、易于测试和维护的应用程序。

Spring Framework特性

Spring Framework 是一个功能全面的企业级应用框架,是构建复杂 Java 应用的基础设施。

核心特性

  • 控制反转 (IoC) / 依赖注入 (DI):这是 Spring 的核心。它将对象的创建和依赖关系的管理权交给 Spring 容器,而不是在代码中手动创建,极大地降低了组件之间的耦合度。
  • 面向切面编程 (AOP):允许将横切关注点(如日志、事务、安全)从业务逻辑中分离出来,使代码更加模块化和纯净。
  • 生态系统:Spring 不仅仅是一个框架,它包含数据访问、事务管理、Web 开发(Spring MVC)、消息处理、测试等一系列解决方案。
  • 集成能力:可以与几乎所有主流的第三方框架和技术(如MyBatis 等)无缝集成。
  • 事务管理:通过简单的注解(如 @Transactional)就可以轻松管理复杂的数据库事务。

适用场景

  1. 几乎概括所有类型的 Java 后端应用,特别是大型、复杂的企业级应用。
  2. 在需要高度可维护、可测试和可扩展的系统上更适用。
  3. 适用于集成多种技术和服务的项目。

使用介绍

  1. 配置组件需要手动配置应用程序的大部分组件,包括通过 XML 文件或 Java 配置类来定义 Bean、配置数据源、设置视图解析器等。
  2. 依赖管理 开发者需手动添加所需的依赖,并解决版本冲突等问题。
  3. 部署运行通常需要将应用打包成 WAR 文件,部署到外部的 Servlet 容器,如 Tomcat。

Spring Boot特性

Spring Boot 是在 Spring Framework 基础上构建的,它简化了 Spring Framework 的使用,让 Spring 的使用变得更加简单和快速,进而提高开发者的效率。

对于所有新项目,大部分人都强烈推荐使用 Spring Boot 来开始,因为它极大地简化了 Spring 应用的配置和开发过程,使得操作更加便捷。

核心特性

  • 简化配置 :基于项目依赖自动配置 Spring 应用,是Spring Boot 最核心的特性。比如,添加 Spring-Boot-Starter-Web 依赖后,Spring Boot 会自动配置 Tomcat 和 Spring MVC。
  • 依赖管理 :提供了一系列 Starter 依赖,快速集成特定功能(如数据库、Web、安全等),简化了 Maven/Gradle 的依赖管理。
  • 内嵌服务器 :内置了 Tomcat等服务器,无需外部服务器即可运行应用,直接通过 main 方法启动即可。
  • 生产就绪功能 :提供了开箱即用的生产特性,如应用程序指标收集、健康检查、外部配置等,方便应用的监控和管理。

适用场景

  1. 微服务架构。
  2. 快速开发 Java 应用。
  3. 需要快速搭建和部署的独立 Java 应用。
  4. 几乎所有新的 Spring 项目都推荐使用 Spring Boot。

特性区别

Spring BootSpring Framework的区别如下:

特性Spring FrameworkSpring Boot
配置方式需要手动配置大量组件,可通过 XML 或 Java 配置类实现。自动配置,基于依赖和约定进行合理配置,减少手动工作。
依赖管理手动添加和管理依赖,需解决版本冲突。使用 Starter 依赖简化管理,提供预设依赖组合。
服务器部署无内嵌服务器,需部署到外部服务器。内嵌 Tomcat等服务器,无需外部服务器。
开发效率配置复杂,开发效率相对较低。自动配置和快速启动,提高开发效率。
适用场景适合大型、复杂、对配置有精细控制要求的应用,或需高度定制化的系统。适合快速开发微服务、和原型应用,简化初始设置。

安全问题

Java代码通过编译后得到的jar包,通过反编译工具可以看到源码,Virbox Protector工具分为java bce和vme方式,支持springFramework 4.0以上的版本,可以防止jar包被反编译。

具体参考Java bce最佳实践Java vme最佳实践

注意

如果引用的框架中使用到了自定义 ClassLoader时(比如struts2、jacoco、groovy等框架),java bce方式目前不支持自定义的ClassLoader,但Java vme方式无此限制。

什么是自定义ClassLoader

ClassLoader 是 Java 加载类(.class 文件)到 JVM 的机制,而自定义 ClassLoader 指的是开发者继承 java.lang.ClassLoader 或其子类,实现自己的类加载逻辑。

示例代码:

public class MyClassLoader extends ClassLoader {
   @Override
   protected Class<?> findClass(String name) throws ClassNotFoundException {
       // 读取 class 文件
       byte[] classData = ...;
       return defineClass(name, classData, 0, classData.length);
  }
}

Virbox Protector工具的java bce方式,会将Application ClassLoader(应用类加载器)替换为自己的ClassLoader去调用,若开发者或使用的框架实现自己的类加载逻辑,就会导致jar包保护后我们的类加载器无法调用去解密处理,进而使得程序运行异常。

区分自定义ClassLoader

  1. 查看源码
  • 一般查看是否有继承 ClassLoader 的类(如 GroovyClassLoader 等)。
  • 一般查看是否有 defineClassfindClassloadClass 等方法的重写,比如at org.apache.catalina.loader.WebappClassLoaderBase.loadClass
  1. 运行时判断

一般通过 Class.getClassLoader() 获取类的加载器,判断是否为自定义实现,比如:

ClassLoader loader = MyClass.class.getClassLoader();
System.out.println(loader.getClass().getName());
  1. 常见自定义 ClassLoader框架

比如Groovy的自定义ClassLoader,如图所示:

滚动至顶部
售前客服
周末值班
电话

电话

13910187371