通过本章学习,可以达到以下目标:
1.掌握SpringBoot项目war包的生成与Tomcat发布。
2.掌握SpringBoot基于https运行模式的配置。
3.掌握SpringBoot错误处理。
4.掌握SpringBoot与文件上传处理。
5.掌握SpringBoot与拦截器的使用。
SpringBoot虽然极大地简化了Web项目开发与部署环节的配置,但是其依然属于Web项目,因此在实际工作中需要考虑与Tomcat的整合,当需要安全访问时还应该提供https支持。在本章中将为读者讲解SpringBoot项目与Tomcat的结合处理、错误处理机制、文件上传处理以及拦截器的使用。
在SpringBoot中默认支持Tomcat容器,所以当一个SpringBoot项目打包生成*.jar文件并且直接执行的时候就会自动启动内部的Tomcat容器。除了此种模式之外,也可以将Web项目打包为*.war文件,采用部署的形式通过Tomcat进行发布处理。
提示:Tomcat部署时的配置。
在将SpringBoot打包为*.war文件的时候,如果想正常部署一定要注意以下两点:
1.取消项目中的Jetty容器的配置。
2.将所有的源文件夹目录设置输出资源,修改父pom.xml中的配置。
1.【mldnboot-web项目】修改pom.xml配置文件,将程序的打包类型定义为*.war。
war
2.【mldnboot-web项目】修改pom.xml配置文件,追加war文件打包插件。
3.【mldnboot-web项目】更新Maven项目,随后会提醒开发者当前项目中缺少WEB-INF/web.xml配置文件,此时需要开发者手工创建。创建完成的目录结构如图4-1所示。
图4-1 创建Web项目
4.【mldnboot-web项目】如果现在项目要以Tomcat的形式运行,那么需要修改SpringBoot程序启动类定义,该类必须要继承SpringBootServletInitializer父类,同时还需要覆写configure()方法。
5.【mldnboot-web项目】对项目进行打包部署(clean package),成功之后会在target目录中形成mldn.war程序文件,随后可以将此文件直接复制到Tomcat所在目录之中,而后启动Tomcat进行项目发布。
SpringBoot启动时默认采用http进行通信协议定义,考虑到安全,往往会使用https进行访问。正常来讲,https的访问是需要证书的,并且为了保证这个证书的安全,一定要在项目中使用CA进行认证。下面只是在本机做一个简单的模拟,利用Java提供的keytool命令实现证书的生成。
1.【操作系统】利用keytool生成一个证书。
该程序执行完成后会生成一个名称为keystore.p12的证书文件,该证书的别名为mytomcat,访问密码为mldnjava。
2.【mldnboot-web项目】将生成的keystore.p12复制到src/main/resources目录中,如图4-2所示。
图4-2 配置安全访问
3.【mldnboot-web项目】修改application.yml文件,配置ssl安全访问。
4.【mldnboot项目】资源目录中增加了*.p12文件,要想让其正常执行,还需要修改resource配置,追加输出文件类型配置。
5.【mldnboot-web项目】虽然现在程序配置了https支持,但考虑到用户访问时可能会使用http访问,所以需要做一个Web配置,使得通过http的80端口访问的请求直接映射到https的443端口上。
此时程序在通过80端口访问时,会自动跳转到https访问的443端口上。
在进行Web开发过程中,用户提交数据的合法性是最基础的验证手段,在SpringBoot中可以直接使用hibernate-vidator组件包实现验证处理,而此组件包中支持的验证注解如表4-1所示。
表4-1 hibernate-vidator验证注解
1.【mldnboot-web项目】在src/main/resources目录下创建ValidationMessages.properties(文件名称为默认设置,不可更改)文件,该文件中要保留所有的错误提示信息。
2.【mldnboot-web项目】建立一个Member程序类,并且在该类上使用验证注解。同时,验证出错时的错误信息引用之前ValidationMessages.properties文件中的定义。
3.【mldnboot-web项目】建立一个MemberController控制器程序类。
本程序为了方便读者理解,除了将错误提示信息以Restful方式返回之外,还直接在后台进行了错误信息的打印。如果用户输入的内容全部正确,则会返回用户输入的信息。
4.【mldnboot-web项目】在src/main/view源文件夹中创建templates/member_add.html页面,定义用户信息增加表单。
本程序由于存在Member数据验证逻辑,在用户信息输入正确时将返回如图4-3所示的界面。如果输入错误,则会返回如图4-4所示的界面。
图4-3 信息输入正确时返回Member对象
图4-4 信息输入错误时返回错误信息
在Web项目开发过程中,错误信息提示页是一个重要的组成部分。无论多么合理的项目,也很难保证不出现类似于404或500的错误问题,而让用户直接看见满是异常信息的页面明显不是一个好的选择。这时,就需要有一个错误信息提示页。
1.【mldnboot-web项目】错误页面一般都属于静态页面,这里在src/main/view/static目录下创建error-404.html和error-500.html两个页面,项目结构如图4-5所示。
图4-5 错误页结构
2.【mldnboot-web项目】建立错误页配置。
配置完错误页之后,会根据用户请求时的http状态码跳转到不同的页面进行显示。
全局异常处理指的是针对程序中产生的Exception进行的处理。产生了异常之后,可以统一跳转到一个页面进行错误提示,也可以通过Restful形式返回错误信息。
提示:关于全局错误与全局异常。
全局错误指的是对http状态码进行的错误跳转处理,全局异常指的是发生某些异常(如果处理的是Exception,则表示处理全部异常)之后的跳转页面。两者属于并行的概念,在项目开发中建议同时配置两者。
另外,如果想方便地观察本程序的执行结果,建议先将错误页的配置取消。
1.【mldnboot-web项目】建立一个全局异常处理,该类可以处理所有的Exception异常。
2.【mldnboot-web项目】建立src/main/view/templates/error.html页面,进行错误信息显示。
3.【mldnboot-web项目】建立一个控制器,主要功能是产生一个异常信息,以观察全局异常处理是否生效。
在本程序中,只要访问/info路径,就会产生异常,而产生异常之后将统一跳转到error.html页面。本程序运行结果如图4-6所示。
图4-6 错误页跳转
提示:基于Restful错误信息提示。
本程序在发生异常之后采用跳转的形式来处理,而SpringBoot最大的特点是支持Restful处理,因此为了描述异常,也可以直接采用Restful的形式回应异常信息,即不再跳转到HTML页面进行显示。
范例: 修改GlobalExceptionAdvice程序类,将其修改为Restful风格显示。
本程序使用了@RestControllerAdvice注解,则此时的异常处理将使用Restful风格,程序发生异常之后的运行效果如图4-7所示。
图4-7 使用Restful处理全局异常
文件上传功能是Web开发的一项重要技术手段,SpringBoot本身也支持文件上传操作,并且其实现原理与SpringMVC相同,唯一的差异是配置相对减少了许多。
SpringBoot采用FileUpload组件实现上传处理,在控制器中可以使用MultipartFile类进行接收。
1.【mldnboot-web项目】建立上传控制器UploadController,利用MultipartFile将上传文件保存在本地磁盘。
2.【mldnboot-web项目】建立src/main/view/templates/upload.html页面。
本程序通过表单传递了姓名(文本)和图片(二进制数据)两个数据信息。控制器接收到此请求信息后,如果有上传文件存在,则会直接返回上传信息(开发者也可以根据情况选择将文件保存),程序运行效果如图4-8所示。
图4-8 文件上传
在实际项目开发中,需要对用户上传文件的大小进行限制,这样才可以保证服务器的资源不被浪费。
1.【mldnboot-web项目】修改application.yml配置文件,增加上传限制。
2.【mldnboot-web项目】对于上传限制,也可以利用Bean实现同样的效果。
此时如果用户上传的内容超过了配置的限制,就会利用全局异常处理,上传出错后页面执行的效果,如图4-9所示。
图4-9 上传限制
如果要进行多个文件的上传,需要通过MultipartHttpServletRequest进行文件接收。
1.【mldnboot-web项目】修改upload.html页面,定义多个文件上传控件。
2.【mldnboot-web项目】修改UploadController控制器,实现多个文件上传。
本程序为了方便文件上传,在控制器类中定义了一个saveFile()方法,以进行文件的保存,同时利用此方法返回了上传文件的保存路径。
提示:上传图片应该保存在图片服务器中。
在本书所讲解的文件上传处理过程中,都是将图片保存到本地的Web服务端,但是从实际的开发来讲,这种操作是不可行的。在当今的项目开发中,最流行的设计理念是高可用、高并发、分布式设计,所以在实际项目中需要搭建专门的图片服务器进行上传资源的保存。如图4-10所示给读者简单地描述了一个Web集群与图片服务器集群的搭建关系。
图4-10 简化的Web与图片服务器集群设计
在本书中,由于只涉及SpringBoot开发框架的使用,所以不会对此部分的内容进行讲解,有兴趣的读者可以登录www.mldn.cn自行学习。
在Web请求处理的过程中,拦截器是服务器端进行数据处理的最后一道屏障,可以将所有用户请求的信息在拦截器中进行验证。在SpringBoot中可以继续使用SpringMVC所提供的拦截器进行处理。
1.【mldnboot-web项目】定义一个拦截器处理类。
在拦截器中最需要用户处理的方法是preHandle(),此方法会在控制层的方法执行之前进行调用。
2.【mldnboot-web项目】如果要拦截器生效,则还需要定义一个拦截器的配置类。
本程序将拦截器配置到了Web项目中,配置的访问路径为全部请求路径,这样不管用户如何访问都会先执行拦截器中的处理方法。
AOP(面向切面编程)是Spring提供的重要技术工具,其主要功能是对业务层的方法调用进行拦截处理。SpringBoot默认情况下并没有配置AOP拦截器,开发者需要在项目中手动引入spring-boot-starter-aop依赖库后才可以使用。
1.【mldnboot-web项目】修改pom.xml配置文件,配置spring-boot-starter-aop依赖库。
2.【mldnboot-web项目】定义业务层接口。
3.【mldnboot-web项目】定义业务层接口实现子类。
4.【mldnboot-web项目】定义AOP程序类,对业务方法进行拦截,本例使用环绕通知处理。
5.【mldnboot-web项目】编写测试类,测试ServiceAspect拦截是否生效。
本程序由于将切入点设置在了所有的业务层上,所以在调用IMessageService接口方法时会自动执行AOP拦截。
1.SpringBoot项目可以将程序打包为war文件,并且部署到Tomcat容器上执行。
2.SpringBoot可以像web.xml文件一样设置状态码的错误跳转页,也可以设置异常的错误跳转页。
3.SpringBoot与SpringMVC上传文件的处理形式相同,但是配置更加简化。
4.SpringBoot可以使用HandlerInterceptor拦截器对控制层的请求进行拦截。
10705)]
本程序由于将切入点设置在了所有的业务层上,所以在调用IMessageService接口方法时会自动执行AOP拦截。
1.SpringBoot项目可以将程序打包为war文件,并且部署到Tomcat容器上执行。
2.SpringBoot可以像web.xml文件一样设置状态码的错误跳转页,也可以设置异常的错误跳转页。
3.SpringBoot与SpringMVC上传文件的处理形式相同,但是配置更加简化。
4.SpringBoot可以使用HandlerInterceptor拦截器对控制层的请求进行拦截。
5.SpringBoot可以直接导入spring-boot-starter-aop编写AOP拦截器,实现业务层拦截。