目录
简介
依赖
常用接口详解
路径匹配规则:configurePathMatch
异步调用支持:configureAsyncSupport
☆☆☆静态资源处理器:addResourceHandlers
静态资源默认处理器:configureDefaultServletHandling
格式化器和转换器:addFormatters
☆☆☆拦截器:addInterceptors
☆☆☆跨域设置:addCorsMappings
方式一:重写WebMvcConfigurer里的addCorsMappings。
方式二:使用过滤器配置配置跨域
☆☆☆视图控制器:addViewControllers
☆☆☆视图解析器:configureViewResolvers
☆☆☆参数解析器:addArgumentResolvers
☆☆☆返回值处理器:addReturnValueHandlers
简介
WebMvcConfigurer是一个接口,里面提供了很多web应用常用的拦截方法。通过实现该接口,可以实现web应用 跨域设置、类型转化器、自定义拦截器、页面跳转等功能。
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
}
依赖
org.springframework.boot
spring-boot-starter
2.6.7
org.springframework
spring-webmvc
5.3.19
常用接口详解
路径匹配规则:configurePathMatch
路径匹配规则:configurePathMatch
设置前端请求url与后端接口url的匹配规则。
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// 默认为true,是否使用尾斜杠匹配:如果设置为true,则“/hello”和“/hello/”都能匹配
configurer.setUseTrailingSlashMatch(false);
// 为所有RestController接口添加统一前缀api:如果controller的url为“/hello” --> "/api/hello"
configurer.addPathPrefix("api", c -> c.isAnnotationPresent(RestController.class));
// UrlPathHelper是一个处理url地址的帮助类,里面自带了一些优化url的方法;
// 比如:getSanitizedPath,就是将// 换成/。所以我们在输入地址栏的时候,//也是没有问题的,
UrlPathHelper urlPathHelper = new UrlPathHelper();
configurer.setUrlPathHelper(urlPathHelper);
// 路径匹配器 PathMatcher是一个接口,springmvc默认使用的是AntPathMatcher
// configurer.setPathMatcher();
}
异步调用支持:configureAsyncSupport
配置异步请求处理选项,可以设置超时时间和异步调用执行器。
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
//核心线程数
threadPoolTaskExecutor.setCorePoolSize(5);
threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);
//最大线程数
threadPoolTaskExecutor.setMaxPoolSize(5);
//配置队列大小
threadPoolTaskExecutor.setQueueCapacity(50);
//配置线程池前缀
threadPoolTaskExecutor.setThreadNamePrefix("async-service-");
threadPoolTaskExecutor.initialize();
// 设置异步调用执行器(线程池)
configurer.setTaskExecutor(threadPoolTaskExecutor);
// 设置超时时间
configurer.setDefaultTimeout(20000);
}
☆☆☆静态资源处理器:addResourceHandlers
自定义静态资源映射目录。
addResourceHandler:对外暴露的访问路径
addResourceLocations:映射内部文件放置的目录,以“/”结尾
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 如果url请求为/resource_test/hello.html,就会去test_file路径下找hello.html文件
registry.addResourceHandler("/resource_test
@Bean
public InternalResourceViewResolver resourceViewResolver()
{
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
//请求视图文件的前缀地址
internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
//请求视图文件的后缀
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.viewResolver(resourceViewResolver());
}
☆☆☆参数解析器:addArgumentResolvers
通常用于在Controller中方法参数传入之前对参数进行处理,然后将处理后的参数传给controller方法中的参数。
// 自定义注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AdminParam {
}
// MyUser实例类
@Data
@ToString
@AllArgsConstructor
public class MyUser {
private String userName;
private String age;
}
// 测试controller
@GetMapping("/admin")
public String admin(@AdminParam MyUser myUser) {
// myUser对象不由前端传入,而是由参数解析器根据请求头中的信息获取。
return myUser.toString();
}
// 自定义参数解析器,当参数有@AdminParam注解时,返回当前用户给controlller参数
@Component
public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
// 判断参数是否需要进行参数解析
// 可以根据参数类型、是否有指定注解等来决定是否进行参数解析
return parameter.hasParameterAnnotation(AdminParam.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 这里方便测试,直接构造了一个虚拟User,实际情况可以根据token解析用户信息。
MyUser myUser = new MyUser("jack", "25");
return myUser;
}
}
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Autowired
private HandlerMethodArgumentResolver myHandlerMethodArgumentResolver;
@Override
public void addArgumentResolvers(List resolvers) {
// 注册参数解析器
resolvers.add(myHandlerMethodArgumentResolver);
}
}
☆☆☆返回值处理器:addReturnValueHandlers
通常用于对controller的返回对象作统一的封装,处理controller返回的数据后再将数据返回该前端。
@Data
@AllArgsConstructor
public class ResponseResult {
private int code;
private Object content;
private String message;
}
@Component
public class MyHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
@Override
public boolean supportsReturnType(MethodParameter returnType) {
// 当controller方法有@AdminParam注解时,执行handlerReturnValue处理逻辑
return !ObjectUtils.isEmpty(returnType.getAnnotatedElement().getAnnotation(AdminParam.class));
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
// 构造ResponseResult标准返回对象返回结果
ResponseResult result = new ResponseResult(200, returnValue, "success");
response.getWriter().write(JSON.toJSONString(result));
}
}
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Autowired
private HandlerMethodReturnValueHandler myHandlerMethodReturnValueHandler;
@Override
public void addReturnValueHandlers(List handlers) {
handlers.add(myHandlerMethodReturnValueHandler);
}
}
以上内容为个人学习理解,如有问题,欢迎在评论区指出。



