关于如何使用Spring Boot从0到1搭建一个Java后台,主要分为三篇文章来介绍:第一篇文章主要介绍搭建一个Java后台需要的相关技术;第二篇文章主要介绍如何使用代码来实现一个完整的后台接口;第三篇文章主要介绍自己在写一个简单java后台项目遇到的一些问题。本篇为第一篇文章。
在写这个Java后台项目的时候,使用了Spring Boot来进行开发,里面采用了Spring MVC的架构风格,使用了Restful来设计对应的Api接口,使用了AES加密与解密算法来实现接口的安全与加密,使用了Mybatis来操作Mysql数据库,使用了单元测试和集成测试来验证接口是否正确。下面就简单介绍下对应的技术。
Spring Boot
大部分Spring Boot应用只需要简单的Spring配置就可以了,而一般的Spring应用则需要很多的配置,比如Spring MVC应用,需要配置dispathcerServlet,需要配置applicationContext.xml、springmvc-config.xml等,还需要添加Spring MVC所依赖的各种jar包。但是在Spring Boot应用中这些都是不需要配置的。我们来创建一个简单的Spring Boot项目,来说明其配置的简单性。
第一步,打开IntelliJ IDEA工具,选择maven,创建一个maven项目出来,项目创建好后如下图所示:
第二步,打开pom.xml,加入以下依赖配置,如下所示:
<repositories>
<repository>
<id>maven-snapshots</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Add typical dependcies for a web application -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Package as an executable jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
第三步,创建一个ArticleSpringBootApplication类,配置main函数,如下图所示:
第四步,创建一个HelloController类,实现Hello World的输出,如下图所示:
第五步,点击ArticleSpringBootApplication旁边的run,运行整个项目,看到如下输出,则说明Spring Boot项目已经成功启动:
第六步,打开浏览器,在地址栏输入http://localhost:8080/hello,就会打印出Hello World,如下图所示:
通过这个例子,我们可以看出在整个Spring Web项目中,我们只是简单地在pom.xml中加入了一些简单的依赖,这相比于传统的web项目创建无疑是简单了许多。为什么Spring Boot的配置这么简单呢?这是因为spring-boot-starter-parent起到了关键的作用。因为Spring项目中的许多配置都默认从spring-boot-starter-parent中继承过来的,这大大减少了spring项目的配置,这也是我为什么选择使用Spring Boot来实现Java后台项目的原因。
更多关于Spring Boot的介绍,可以参考官方文档给出的介绍,链接如下所示:
REST
REST是一种分布式应用的架构,也是一种大流量分布式应用的设计方法论。REST的英文全称为Representational State Transfer,翻译成中文就是表现层状态转换。要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词都代表了什么涵义,把这个搞懂了,就能理解REST是一种什么样的设计。关于如何理解REST,可以参考阮一峰老师的这篇文章。
引用一下阮一峰老师总结的RESTful架构:
- 每一个URI代表一种资源。
- 客户端和服务器之间,传递这种资源的某种表现层。
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现表现层状态转化。
理解完什么是RESTful架构后,我们看下在设计RESTful Api需要注意的地方,最常见的错误就是URI中包含动词。因为资源表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。比如某个URI为/hrm/users/show,其中show为动词,这样设计出来的URI就错误了。这个URI的目的是查询用户的列表,但是在URI中不应该出现show动词,而是应该通过HTTP的GET方法表示show,所以正确的URI应该为GET /hrm/users。下面通过一个简单的例子来说明下HTTP中的5种动作请求。
GET /hrm/users 查询用户的列表
POST /hrm/users 增加一个用户
DELETE /hrm/users/id 删除一个用户
PUT /hrm/users/id 更新一个用户(提供该用户的全部信息)
PATCH /hrm/users/id 更新一个用户(提供该用户的部分信息)
更多关于Restful Api设计可以参考阮一峰老师的另外一篇文章。
Mybatis
关于Mybatis的介绍与使用可以参考我之前写的Mybatis使用介绍这篇文章,下面介绍下在Spring Boot中如何使用Mybatis。打开pom.xml加入以下依赖:
<!-- Mybatis集成 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
再打开application.properties加入JDBC配置就可以了,如下所示:
# JDBC配置
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/ddn_hrm_db?useUnicode=true&characterEncoding=utf8
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
这样mybatis的配置就完成了,mybatis的具体使用会在我的下篇文章中有详细的介绍。
接口安全与加密
现在大部分后台接口都采用RESTful架构,RESTful Api的身份证应该使用OAuth2.0框架,也就是说客户端在每次请求时都要带上身份验证信息,实现上,大部分都采用token的认证方式,一般流程如下所示:
- 用户登录成功后,服务器端返回token和refreshToken给客户端。
- 客户端把token、refreshToken保存到本地,以后发送的每个请求,都将token发回服务器端。
- 服务器端检查token的有效性,有效则返回数据,若无效,分为两种情况:
- token错误,用户需要重新登录,获取正确的token。
- token过期,用户重新登录,使用refreshToken重新获得token。
使用OAuth2.0进行api身份验证,比较适合对外提供的api,对于公司内部的api,一般采用接口加密的方法来进行实现。在这个Java后台项目中,就是采用的接口加密的方法,主要用到了md5加密算法和AES加密算法。
MD5算法是典型的消息摘要算法,常用于验证数据的完整性,是数字签名算法的核心算法。其前身有MD2、MD3和MD4算法,它由MD4、MD3、MD2算法改进而来。不论哪一种MD算法,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。因为MD5算法常用于验证数据的完整性,所以客户端在发送一个请求的时候,客户端对请求所传的参数进行MD5计算从而得到一个sign签名,传递给服务器端。服务器端,拿到客户端传递过来的参数再次进行MD5计算得到一个新的sign签名。如果客户端传递过来的sign签名和服务器端计算出来的sign签名相等,则说明数据是完整性的,否则,数据在传输的过程中已经被篡改了。
AES加密算法是对称加密算法,AES算法因密钥建立时间短、灵敏性好、内存需求低等优点,应用的比较广泛,并且目前采用的AES算法能够有效抵御已知的针对DES算法的所有攻击方法。在上面我们只是对参数进行MD5计算得到一个sign签名,用来校验数据是否完整性,但是数据在传输的过程中,我们还要对传输的数据进行下AES加密,这样就能够有效地提高接口的安全性。
更多关于加密算法的内容,可以去这里下载下Java加密与解密的艺术 提取密码:6j4v
参考文章:
测试
Spring Boot提供了一系列的工具和注解来测试你的应用,主要通过以下两个组件来进行实现。
- spring-boot-test 包含了核心的部分。
- spring-boot-test-autoconfigure 支持自动配置。
对于大部分的开发者会使用spring-boot-starter-test,它里面包含了JUnit、AssertJ、Hamcrest组件以及其他许多有用的库。其中JUnit主要用于进行单元测试,Spring Test和Spring Boot Test主要用于集成测试。
想更多了解测试的内容,可以参考下面两篇文章:
Spring-boot-reference关于Testing的那部分
总结
这篇文章主要就讲了下自己在写这个Java后台项目时用到了哪些技术,看了哪些文章,整理了下,希望对刚开始学习Java后台开发的人有所帮助。我会在第三篇文章的时候,把自己写的这个简单的Java后台项目给开源出来,到时欢迎大家关注。