SpringBoot MVC功能拓展
有时候我们需要对SpringBoot MVC的功能进行扩展,如添加自定义拦截器、ViewController、静态资源映射、消息转换器、视图控制器等。 springboot官方对于mvc的扩展时,建议我们实现 WebMvcConfigurer 接口,并且要将该实现类加入到容器中。
WebMvcConfigurer接口其实是spring的一种内部配置方式,采用java Bean的形式代替传统的xml配置形式,可以自定义一些Handler,Interceptor,ViewResolver, MessageConverter等
注:这里不实现任何接口方法也不会报错。因为jdk1.8之后,接口支持默认实现。

一般把此类Config配置类,放置在的 config 包下。
如果想对Spring MVC完全控制,你可以添加自己的 @Configuration 注解 @EnableWebMvc ,这个时候springmvc的默认配置全部失效,都需要自己配置。
定制静态资源映射:
在 MyWebConfig 类中重写 addResourceHandlers 方法
1、在 resource 目录下添加 myStatic 目录。
2、分别在 static、 myStatic以及 D盘z目录下新建hello.js。hello.js中注释记录各自的路径:
static/hello.js:

myStatic/hello.js:

D:\z\hello.js:

3、在 MyWebConfig 类中重写 addResourceHandlers 方法。

注意:如果前后映射的url一致,后添加的会覆盖前面添加的。如果添加的URL为 /** 会覆盖springboot 默认的资源映射规则。
下面这种写法,就只有 file:///D:/z/ 有效

也可以在同一个URL映射下添加多个资源路径,此时,要避免出现同名资源文件。如果有同名的文件,资源覆盖的情况

定制ViewController
注意:需要引入Thymeleaf依赖。
1、在templates目录下添加 myIndex.html:

2、在 MyMvcConfig 中重写 addViewControllers 方法

SpringBoot MVC拦截器 Interceptor
自定义拦截器MyInterceptor,需要实现HandlerInterceptor,重写三个方法
preHandle(在请求方法处理之前进行调用),此方法返回值决定此次请求是否拦截。ture 放行、false拦截
postHandle(请求方法处理之后进行调用,但是在视图被渲染之前)
afterCompletion(在整个请求方法结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作))
HandlerInterceptor拦截的是controller
自定义拦截器,直接放行。
跨域处理(CORS)
出于安全性,浏览器限制脚本内(多数情况指ajax)发起的跨源HTTP请求。这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头(也就是除非网站本身允许你跨域访问)。
简单说A应用只能访问A应用后台传来数据,B应用只能访问B应用后台传来的数据,如果A应用用Ajax获取数据时的URL地址中的协议、端口、域名其中有一个和B应用对应的话,则是A应用跨域了想获取B应用数据,是不允许的。这里的不允许是指不允许你获取请求体内容,并不是不许请求。这是出于浏览器的同源策略限制。
同源策略(Sameoriginpolicy)是一种约定,所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)它是浏览器最核心也最基本的安全功能,如果缺少了 同源策略,则浏览器的正常功能可能都会受到影响。


局部跨域配置
局部跨域配置使用 @CrossOrigin 注解,可以用在控制器类和方法上:
在控制器(类上)使用@CrossOrigin注解,表示该控制器的所有方法允许跨域
在控制器的某一方法上使用@CrossOrigin注解,表示该方法允许跨域
@CrossOrigin 注解的参数与全局配置中的基本一致