文章目录
【项目经验】springBoot在拦截器获取PathVariable中的值(替换url内的参数)
1、controller层方法如下:
/** * 查询节点元数据信息 * @param request * @param clusterId * @param * @param * @return */ @GetMapping("/api/{clusterId}/{name}/metadata") public String getNodeMetadata(HttpServletRequest request, @PathVariable("clusterId") String clusterId, @PathVariable("name") String name) throws CloudNativeException { ResponseJson result = new ResponseJson(); Optional.ofNullable(clusterId).orElseThrow(()->new CloudNativeException(ErrorCode.CODE_17005,"clusterId")); Optional.ofNullable(name).orElseThrow(()->new CloudNativeException(ErrorCode.CODE_17005,"name")); result = k8sNodeInfoService.getNodeMetadata(request,clusterId,name); return JSON.toJSONStringWithDateFormat(result,"yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteDateUseDateFormat,SerializerFeature.WriteNullStringAsEmpty); }
2、定义拦截器,在拦截器内的方法如下:
Map<String, String> pathVars = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
3、获取的结果如下
{"clusterId":"0001","name":"测试节点"}
4、一般场景:
当我们做资源权限时,会把前端传入的url进行参数替换,并且与数据库内用户拥有的权限url作对比,此时就需要把PathVariable进行替换
方法如下:
//用来替换 url 中的 id // content 代表url map代表上述方法获取的PathVariable public String replaceNum(String content,Map<String, String> map) { if (map == null) { return content; } else { for(Map.Entry<String, String> vo : map.entrySet()){ String key = vo.getKey(); String value = vo.getValue(); String str = "{" + key + "}"; String replace = content.replace(value, str); content = replace; } } return content; }