SSO是公司一个已经存在了若干年的项目,后端采用SpringMVC、MyBatis,数据库使用MySQL,前端展示使用Freemark。今年,我们对该项目进行了一次革命性的改进,改造成SpringCloud架构,并且把前后端分离,前端采用Vue框架。
一、使用SpringCloud架构进行改造
1.1 为什么使用SpringCloud
SpringCloud的核心是SpringBoot,相比较于传统的Spring,SpringCloud具有以下优点:
- 部署简单,SpringBoot内置了Tomcat容器,可以将程序直接编译成一个jar,通过java-jar来运行。
- 编码简单,SpringBoot只需要在pom文件中添加一个starter-web依赖,即可帮助开发者快速启动一个web容器,非常方便。
- 配置简单,SpringBoot可以通过简单的注解方式来代替原先Spring非常复杂的xml方式。如果我想把一个普通的类交给Spring管理,只需要添加@Configuration和@Bean两个注解即可。
- 监控简单,我们可以引入spring-boot-start-actuator依赖,直接使用REST方式来获取进程的运行期性能参数,从而达到监控的目的。
1.2 一个常规项目都需要改造哪些部分
1.2.1 配置文件
SSO项目改造前充斥着大量的配置文件,主要包含以下这些部分:
- 静态资源相关
- 数据源
- mybatis配置
- redis配置
- 事务
- 拦截器拦截内容
- 监听器、过滤器
- 组件扫描路径配置
本文着重介绍以下几个部分:
1)静态资源处理
SpringMVC中,如果mvc:interceptors
配置的URL规则如下,则不会拦截静态资源。
<mvc:mapping path="/*.do" />
但是如果配置的是:
<mvc:mapping path="/**" />
方案1: 在web.xml中配置<servlet-name>default</servlet-name>
,用defaultServlet
先处理请求如:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ico</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
方案2:使用<mvc:resources />
标签声明静态资源路径
<mvc:resources mapping="/resources/js/**" location="/js/" />
<mvc:resources mapping="/resources/images/**" location="/images/" />
<mvc:resources mapping="/resources/css/**" location="/css/" />
方案3:使用mvc:default-servlet-handler/
标签
SpringBoot解决方案:继承WebMvcConfigurerAdapter实现addResourceHandlers方法。
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/resource/")//sso静态资源
.addResourceLocations("classpath:/META-INF/resources/")//swagger静态资源
.setCachePeriod(0);//0表示不缓存
}
sso静态资源文件路径如图:
2)拦截器
SpringMVC配置文件内容:
拦截任何请求并且初始化参数,有些请求是不需要拦截的,有的请求登录后不需要经过权限校验直接放行。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />