SpringMVC filter中使用Path Mapping

先看效果

 

配置文件"/config/pathMapping.json"

内容:

/*** 将被 /com/common/web/filter/RequestbodyFilter.java 调用 **/
/**  <实际不存在的接口路径A,真实的接口路径B> ***/
{
  "/aa": "/bbb",
  "/111": "/222",
"/demo/cid/aaa/json":"/demo/cid/bbb/json"
}

 

配置文件在哪里被读取

核心代码:

 /***
         * <实际不存在的接口路径A,真实的接口路径B> <br>
         *     A映射到B
         */
        private Map<String, String> handlerMethodPathMap;

        /***
         * servlet 路径映射,类似于nginx的转发功能<br />
         * see https://my.oschina.net/huangweiindex/blog/1789164
         */
        public void initMapping() {
            handlerMethodPathMap = new HashMap<>();
            //从本地文件"/config/pathMapping.json"中读取
            handlerMethodPathMap.put("/agent/afterbuy/list/json", "/agent/afterbuy/listfilter/json");
            ClassLoader classLoader = this.getServletContext().getClassLoader();
            String resourcePath = "/config/pathMapping.json";
            String json = GenericReadPropsUtil.getConfigTxt(classLoader, resourcePath);
            System.out.println("config/pathMapping.json :" + json);
            if (null != json) {
                json = RegexUtil.sedDeleteComment(json);//删除第一行的注释
                handlerMethodPathMap.putAll(HWJacksonUtils.deSerializeMap(json, String.class));
            }
        }
 /***
         * see https://my.oschina.net/huangweiindex/blog/1789164
         * @return
         */
        @Override
        public String getServletPath() {
            String servletPath = super.getServletPath();
            //映射
            String lookupPath = null;
            if (!ValueWidget.isNullOrEmpty(handlerMethodPathMap)) {
                //<实际不存在的接口路径A,真实的接口路径B>
                if (handlerMethodPathMap.containsKey(servletPath)) {
                    lookupPath = handlerMethodPathMap.get(servletPath);
                } /*else {
                    lookupPath = (String) SystemHWUtil.reverseMap(handlerMethodPathMap).get(servletPath);
                }*/
            }
            if (ValueWidget.isNullOrEmpty(lookupPath)) {
                lookupPath = servletPath;
            } else {
                String msg = "SpringMVC 层实现 Path Mapping,old:" + servletPath + "\tnew:" + lookupPath + " 将被真正调用";
                logger.warn(msg);
                System.out.println(msg);
                httpClientRestLogger.error(msg);
            }
            return lookupPath;
        }

 

核心思路:

说白了,就是通过重写request的getServletPath()方法来实现的

 

转载于:https://my.oschina.net/huangweiindex/blog/1789164

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值