文章目录
简介
WebMvcConfigurer配置类其实是Spring
内部的一种配置方式,采用JavaBean
的形式来代替传统的xml
配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类并实现**WebMvcConfigurer
** 接口;
WebMvcAutoConfiguration是WebMvc的自动配置类,配置关于web项目的一些文件,而WebMvcConfigurer是一个接口,该接口用于补充WebMvcAutoConfiguration自动配置类,也就是说如果在WebMvcAutoConfiguration有没有考虑到的地方,可以通过WebMvcConfigurer接口扩展。
WebMvcConfigurer接口
public interface WebMvcConfigurer {
default void configurePathMatch(PathMatchConfigurer configurer) {
}
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
}
default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
}
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}
default void addFormatters(FormatterRegistry registry) {
}
default void addInterceptors(InterceptorRegistry registry) {
}
default void addResourceHandlers(ResourceHandlerRegistry registry) {
}
default void addCorsMappings(CorsRegistry registry) {
}
default void addViewControllers(ViewControllerRegistry registry) {
}
default void configureViewResolvers(ViewResolverRegistry registry) {
}
default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
}
default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
}
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
}
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}
default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}
@Nullable
default Validator getValidator() {
return null;
}
@Nullable
default MessageCodesResolver getMessageCodesResolver() {
return null;
}
}
常用的方法:
/* 拦截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 视图跳转控制器 */
void addViewControllers(ViewControllerRegistry registry);
/**
*静态资源处理
**/
void addResourceHandlers(ResourceHandlerRegistry registry);
/**
* 这里配置视图解析器
**/
void configureViewResolvers(ViewResolverRegistry registry);
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;
addInterceptors:拦截器
首先需要写一个拦截器类如下图
然后需要在springmvc扩展类中的addInterceptors方法中写一段代码,如下图
最后是测试阶段:
- addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
- addPathPatterns:用于设置拦截器的过滤路径规则;
addPathPatterns("/**")
对所有请求都拦截 - excludePathPatterns:用于设置不需要拦截的过滤规则
- 拦截器主要用途:进行用户登录状态的拦截,日志的拦截等。
addResourceHandlers:静态资源
springboot中默认的静态目录有四个:classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public
这四个静态目录对外面暴露的路径都是/**,也即是访问这四个静态目录里面的东西时可以直接用localhost:8080/这个接口。
现在我们可以通过addResourceHandlers定制我们需要的静态目录,并且此过程不会影响已经存在的四个静态资源目录。
具体代码如下图:
addViewControllers:页面跳转
页面跳转指的是templates文件夹下的html文件不能够直接访问,比如templates文件夹下有一个login.html文件,如果直接访问如
localhost:8080/login.html这样是访问不到的,解决办法可以用上面的addResourceHandlers指定静态资源来解决;当然也可以通过控制器来解决,就是比如你想访问templates目录下的login.html文件,可以在控制器中写一个RequestMapping(path="/toLogin")的方法,让此方法return “login”;这样就可以通过控制器访问templates目录中的login.html文件了,即通过localhost:8080/toLogin接口访问。但是写控制器代码太麻烦了,我们可有直接在addViewControllers方法中写一段代码,如下
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/toLogin").setViewName("login");
}
这样就能和上面的写一个控制器实现的效果相同,也可以通过localhost:8080/toLogin接口访问templates模板中的login.html文件
并且此中方式不会影响已经在controller控制器包中写的控制器。
configureViewResolvers:视图解析器
需要注意的一个细节是:如果springboot中存在thymeleaf引擎模板,那么默认的视图解析器是prefix:classpath:/templates/,
suffix:.html 并且此优先级最高,只要有它其它的视图解析器即便配置了也没有用。
addCorsMappings:跨域
springboot中配置的解决跨域问题的文件如下图:
记住allowedOrigins方法的参数不是springboot自身的URL而是别人的url就行了。