Spring全家桶简介
Spring发展到现在,全家桶所包含的内容非常庞大,这里主要介绍其中关键的5个部分,分别是spring framework、 springboot、 spring cloud、spring security、spring mvc。其中的spring framework就是大家常常提到的spring, 这是所有spring内容最基本的底层架构,其包含spring mvc、springboot、spring core、IOC和AOP等等。Spring mvc就是spring中的一个MVC框架,主要用来开发web应用和网络接口,但是其使用之前需要配置大量的xml文件,比较繁琐,所以出现springboot,其内置tomcat并且内置默认的XML配置信息,从而方便了用户的使用。下图就直观表现了他们之间的关系。
而spring security主要是用来做鉴权,保证安全性的。Spring Cloud基于Spring Boot,简化了分布式系统的开发,集成了服务发现、配置管理、消息总线、负载均衡、断路器、数据监控等各种服务治理能力。
整个spring家族有四个重要的基本概念,分别是IOC、Context、Bean和AOP。其中IOC指控制反转,在spring中的体现就是将对象属性的创建权限回收,然后统一配置,实现解耦合,便于代码的维护。在实际使用过程中可以通过autowired注解,不是直接指定某个类,将对象的真实类型放置在XML文件中的bean中声明,具体例子如下:
<bean name="WelcomeService"class="XXX.XXX.XXX.service.impl.WelcomeServiceImpl"/>
<code>publicclassWelcomeController { </code><code>@Autowired </code><code>private WelcomeService service; </code><code>@RequestMapping("/welcome") </code><code>public String welcome() { </code><code>return service.retrieveWelcomeMessage(); </code><code> } </code><code>} </code>
Spring将所有创建或者管理的对象称为bean,并放在context上下文中统一管理。至于AOP就是对各个MVC架构的衔接层做统一处理,增强了代码的鲁棒性。下面这张图就形象描述了上述基本概念。
各子组件介绍
Spring发展至今,整个体系不断壮大,子分类非常庞大,这里只对本次涉及的一些组件做简单的介绍。
首先是Spring Websocket,Spring内置简单消息代理。这个代理处理来自客户端的订阅请求,将它们存储在内存中,并将消息广播到具有匹配目标的连接客户端。Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,其主要目标是使数据库的访问变得方便快捷。Spring Data Commons是Spring Data下所有子项目共享的基础框架,Spring Data家族中的所有实现都是基于Spring Data Commons。简单点说,Spring Data REST把我们需要编写的大量REST模版接口做了自动化实现,并符合HAL的规范。Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序,可以将流程的定义和实现流程行为的类和视图分离开来。
使用量及使用分布
根据全网数据统计,使用Spring的网站多达80万余,其中大部分集中在美国,中国的使用量排在第二位。其中香港、北京、上海、广东四省市使用量最高。通过网络空间搜索引擎的数据统计和柱状图表,如下图所示。
漏洞背景介绍(SpEL使用)
0x10 SpEL是什么
SpEL是基于spring的一个表达式语言,类似于struts的OGNL,能够在运行时动态执行一些运算甚至一些指令,类似于Java的反射功能。就使用方法上来看,一共分为三类,分别是直接在注解中使用,在XML文件中使用和直接在代码块中使用。
0x20 SpEL能做什么
● 基本表达式
包括逻辑运算,三目运算和正则表达式等等。
● 类操作表达式
对象方法调用,对象属性引用,自定义函数和类实例化等等。
● 集合操作表达式
字典的访问,投影和修改等等。
● 其他表达式
模板表达式
0x30 SpEL demo
0x31 基于注解的SpEL
可以结合sping的@Value注解来使用,可以直接初始化Bean的属性值
<code>@RestController</code><code>classSangfor {</code><code>@Value(value ="${"aaa".toUpperCase()}")</code><code>private String test;</code><code>public String getTest(){return test;}</code><code>public void setTest(String value){this.test = value;}</code><code>}</code>
在这种情况下可以直接将test的值初始化为 AAA 。
此外,还有很多其他注解的使用方式,可以结合上面提到的表达式的四种使用模式。
0x32 基于XML的SpEL
可以直接在XML文件中使用SpEL表达式如下:
<code><?xml version="1.0" encoding=