spring
在spring中配置webMvc有两种方法,一种是继承WebMvcConfigurationSupport,另一种方式就是继承WebMvcConfigurer,但是要多加一个@EnableWebMvc注解。
作用:
WebMvcConfigurer是一个接口,用于配置全局的SpringMVC的相关属性,采用JAVABEAN的方式来代替传统的XML配置文件,提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。
WebMvcConfigurationSupport类是SpringMVC提供的扩展类,用于提供拦截器、资源处理器等注册功能。
常用示例:
① 配置路径匹配规则
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// 是否使用尾斜杠匹配, 默认为TRUE。TRUE, 表示"/hello"和"/hello/"都能匹配。
configurer.setUseTrailingSlashMatch(false);
// 为所有的接口添加统一前缀。如果的URL为: "/hello", 则转换为: "/api/hello"
configurer.addPathPrefix("api", c -> c.isAnnotationPresent(RestController.class));
// UrlPathHelper是一个处理URL地址的帮助类, 自带了一些优化URL的方法;
// 如:getSanitizedPath,就是将"//"自动转换为"/", 所以当输入为"//"也是没有问题的,
UrlPathHelper urlPathHelper = new UrlPathHelper();
configurer.setUrlPathHelper(urlPathHelper);
}
② 配置静态资源映射器(用于自定义静态资源的映射目录)
// addResourceHandler:用于设置对外暴露的访问路径
// addResourceLocations:用于映射内部文件放置的目录,需要以“/”结尾
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/** 本地文件上传路径 */
// 对外暴露的访问路径
registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
// 映射内部文件放置的目录,以“/”结尾
.addResourceLocations("file:" + ServicexConfig.getProfile() + "/");
/** swagger配置 */
registry.addResourceHandler("/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
}
③ 配置请求拦截器
可以设置多个拦截器,如对特定的URL设定处理规则、打印处理用户请求耗费的时间、定义防止重复提交等功能。
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 增加一个拦截器,对请求做一些自定义处理
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("loginUser");
if (user == null) { //未登陆,返回登陆页面
request.setAttribute("msg", "没有权限请先登陆");
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
} else { //已登陆,放行请求
return true;
}
}
})
// 设置拦截器的过滤路径规则:只拦截/admin/形式的请求
.addPathPatterns("/admin/**")
// 设置不需要拦截的过滤规则:不拦截/admin/login请求
.excludePathPatterns("/admin/login");
}
④ 跨域设置文章来源:https://www.toymoban.com/news/detail-551903.html
方法一:
@Override
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路径
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOrigins("*")
// 是否允许证书
.allowCredentials(true)
// 设置允许的方法
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许时间
.maxAge(3600);
}
方法二:
/**
* 跨域配置
*/
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
config.addAllowedOriginPattern("*");
// 设置访问源请求头
config.addAllowedHeader("*");
// 设置访问源请求方法
config.addAllowedMethod("*");
// 有效期 1800秒
config.setMaxAge(1800L);
// 添加映射路径,拦截一切请求
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
// 返回新的CorsFilter
return new CorsFilter(source);
}
⑤ 视图控制器(用于将请求的URL进行处理)
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 如果请求为:/admin,则重定向到/login
registry.addRedirectViewController("/admin", "/login");
// 如果请求为:/admin/delete,则返回500状态
registry.addStatusController("/admin/delete", HttpStatus.INTERNAL_SERVER_ERROR);
// 如果请求URL为:/hello,则直接跳转到hello页面
registry.addViewController("/hello").setViewName("hello");
}
⑥ 内容协商(用于将一个URL直接跳转到页面)
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
// 自定义策略
configurer.favorPathExtension(true)// 是否通过请求Url的扩展名来决定mediaType,默认true
.ignoreAcceptHeader(true)// 不检查Accept请求头
.parameterName("mediaType")
.defaultContentType(MediaType.TEXT_HTML)// 设置默认的MediaType
.mediaType("html", MediaType.TEXT_HTML)// 请求以.html结尾的会被当成MediaType.TEXT_HTML
.mediaType("json", MediaType.APPLICATION_JSON)// 请求以.json结尾的会被当成MediaType.APPLICATION_JSON
.mediaType("xml", MediaType.APPLICATION_ATOM_XML);// 请求以.xml结尾的会被当成MediaType.APPLICATION_ATOM_XML
}
⑦ 信息转化器扩展(自定义FASTJSON为JSON消息的转换器,完成的功能如下)
1、请求返回体使用FASTJSON来序列化;
2、配置如果字段类型为Date,输出为"yyyy-MM-dd HH:mm:ss"格式;
3、配置允许输出值为null的字段;
4、配置字符类型字段,如果为null,输出为"",而非null;
5、配置把Long类型的数据序列化成JSON后传给前端,解决前端可能会出现精度丢失的情况。文章来源地址https://www.toymoban.com/news/detail-551903.html
@Configuration
public class MyFastJsonConfig extends WebMvcConfigurationSupport{
/**
* 使用阿里 fastjson 作为 JSON MessageConverter
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
// 保留map空的字段
SerializerFeature.WriteMapNullValue,
// 将String类型的null转成""
SerializerFeature.WriteNullStringAsEmpty,
// 将Number类型的null转成0
SerializerFeature.WriteNullNumberAsZero,
// 将List类型的null转成[]
SerializerFeature.WriteNullListAsEmpty,
// 将Boolean类型的null转成false
SerializerFeature.WriteNullBooleanAsFalse,
// 避免循环引用
SerializerFeature.DisableCircularReferenceDetect);
converter.setFastJsonConfig(fastJsonConfig);
//日期格式化
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
converter.setDefaultCharset(Charset.forName("UTF-8"));
List<MediaType> mediaTypeList = new ArrayList<>();
// 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
mediaTypeList.add(MediaType.APPLICATION_JSON);
converter.setSupportedMediaTypes(mediaTypeList);
converters.add(converter);
}
}
到了这里,关于MVC配置类之WebMvcConfigurationSupport的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!