【项目经验】springBoot在拦截器获取PathVariable中的值

【项目经验】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;
   }
SpringBoot拦截器获取参数并进行反设的方法有多种。根据引用\[2\]的内容,如果是接口地址后面问号拼接的参数或表单参数,可以使用`request.getParameter("参数名")`来获取。而对于POST请求的body参数,可以通过调用`request.getInputStream()`获取流,然后从流读取参数。但是需要注意的是,经过拦截器后,参数经过`@RequestBody`注解赋给controller的方法时,可能会抛出`org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing`异常。这可能是因为在拦截器已经读取了一次流,导致controller无法再次读取。解决这个问题的方法是在拦截器将流进行包装,以便在controller能够正常读取参数。具体的实现方式可以根据具体的需求和场景进行调整。 #### 引用[.reference_title] - *1* *3* [SpringBoot拦截器如何获取http请求参数](https://blog.csdn.net/weixin_29331015/article/details/111948704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [springboot拦截器获取http请求参数](https://blog.csdn.net/z17806289513/article/details/124454000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值