Spring Boot开发中,有时会遇到某些url资源路径会有有效期的限制,超过有效期的话就不能正常访问,这时可以通过Spring MVC提供的RequestMappingHandlerMapping来编程式控制动态注册/删除资源路径,达到我们的目的,下面来看下怎么实现~
参考Spring官方文档说明:https://docs.spring.io/spring-framework/docs/5.3.6/reference/html/web.html#mvc-ann-requestmapping-registration
工作原理
RequestMappingHandlerMapping继承了AbstractHandlerMethodMapping,其中提供了registerMapping与unregisterMapping,分别用于注册Mapping信息与删除Mapping信息
实现注册信息
public void registerMapping(RequestMappingInfo mapping, Object handler, Method method) {
super.registerMapping(mapping, handler, method);
this.updateConsumesCondition(mapping, method);
}
实现删除注册信息
public void unregisterMapping(T mapping) {
if (this.logger.isTraceEnabled()) {
this.logger.trace("Unregister mapping \"" + mapping + "\"");
}
this.mappingRegistry.unregister(mapping);
}
通过这两个方法,我们就可以在工程中方便的编写注册与删除url资源路径的逻辑了
使用方式
1.编写注册/删除用的Controller层方法
示例代码:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/RequestMappingController.java
/**
* 动态注册路径映射
*
* @param data
* @return
*/
@PostMapping("registerMapping")
public RequestMappingInfo registerMapping(@RequestBody Map data) {
//从请求参数中构建RequestMappingInfo对象;包括请求的资源路径,执行控制器类以及方法等
RequestMappingInfo mappingInfo = RequestMappingInfo.paths(data.get("path").toString()).build();
//通过Spring IOC容器获取对应的bean实例
Object bean = applicationContext.getBean(data.get("bean").toString());
try {
//注册Mapping信息逻辑
requestMappingHandlerMapping.registerMapping(mappingInfo, bean, bean.getClass().getDeclaredMethod(data.get("method").toString(), null));
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return mappingInfo;
}
/**
* 动态删除路径映射
*
* @param data
* @return
*/
@PostMapping("unregisterMapping")
public RequestMappingInfo unregisterMapping(@RequestBody Map data) {
//根据请求参数封装RequestMappingInfo对象,这里主要根据path路径来做删除注册逻辑
RequestMappingInfo mappingInfo = RequestMappingInfo.paths(data.get("path").toString()).build();
//执行删除注册逻辑
requestMappingHandlerMapping.unregisterMapping(mappingInfo);
return mappingInfo;
}
2.编写测试用的控制器类,来作为动态注册资源路径的处理器
示例代码:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/DynamicHandler.java
@RestController
public class DynamicHandler {
public String test() {
log.debug("test execute");
return this.getClass().getSimpleName();
}
}
运行效果
1.启动工程,访问/mapping/registerMapping接口注册Mapping映射信息,来实现动态资源路径注册效果
2.注册完成后,访问我们设置的path:/yourpath,可以看到我们的控制器方法已经
执行了
后台日志打印
3.再次访问删除注册信息接口/mapping/unregisterMapping,来删除我们刚刚添加的映射信息
4.此时再访问/yourpath资源路径,发现已经返回404了~
网友评论