先看效果
配置文件"/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()方法来实现的