玖叶教程网

前端编程开发入门

Spring Boot动态注册/删除http资源路径的方法

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,其中提供了registerMappingunregisterMapping,分别用于注册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了~

完整测试工程参考:https://github.com/netbuffer/spring-boot-demo

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言