美文网首页
Spring Boot动态注册/删除http资源路径的方法

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

作者: 向上生长之路 | 来源:发表于2021-10-03 20:12 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Spring Boot动态注册/删除http资源路径的方法

          本文链接:https://www.haomeiwen.com/subject/wexunltx.html