怎么对@PathVariable中的特殊字符进行处理

  介绍

这期内容当中小编将会给大家带来有关怎么对@PathVariable中的特殊字符进行处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

, @GetMapping (value=https://www.yisu.com/zixun//user/{useraccount})   公共空间getUserAccount (@PathVariable (useraccount)字符串useraccount) {      logger.info (“useraccount:“+ useraccount);   }

正常访问:

/user/zhangsan

打印:useraccount: zhangsan

看似一切正常

<>强但是:

访问:/user/zhangsan lisi/

打印:useraccount: zhangsan

咦,为啥不是useraccount: zhangsan/lisi ?

@PathVariable并没有我们想象的聪明,对于参数中的/并不能跟实际路径/分开

事实上,有。;——等都不能正确切分。

怎么办呢?

两种方案:

1,简单点,直接使用@RequestParam代替

, @GetMapping (value=https://www.yisu.com/zixun//用户)   公共空间getUserAccount (@RequestParam (useraccount)字符串useraccount) {      logger.info (“useraccount:“+ useraccount);   }

用/用户吗?useraccount=zhangsan访问

2,使用正则过滤

, @GetMapping (value=https://www.yisu.com/zixun/?user/{useraccount: [a-zA-Z0-9///-//_//,///] +}”)   公共空间getUserAccount (@PathVariable (useraccount)字符串useraccount) {      logger.info (“useraccount:“+ useraccount);   }

正常访问:

/user/zhangsan

打印:useraccount: zhangsan

当然,这个就有点不灵活了,第一种简单又方便

<强>补充:记一次@PathVariable特殊参数会丢失的排查问题

请求参数中如果包含。,会造成参数丢失,请看如下代码

以下代码,省略@RestController控制层类代码

@RequestMapping (value =,“你好/{名称}“)   public  Map<字符串,Object>, sayHello (@PathVariable (“name"), String 名字,,HttpServletRequest 请求),{   ,Map<字符串,Object>, rtnMap =, new  HashMap<在();   ,rtnMap.put (“msg",,“hello “, +,名称);   ,return  rtnMap;   }

请求地址:你好/地区指定基金,则正常返回{“msg":“你好ddf"}

请求地址:你好/ddf.com,依然还是返回{“msg":“你好ddf"}

如果需要解决上面这个问题,则可以将代码更改如下(该解决方式从网上搜寻)

@RequestMapping (value =,“你好/{名称:. *}“)   public  Map<字符串,Object>, sayHello (@PathVariable (“name"), String 名字,,HttpServletRequest 请求),{   ,Map<字符串,Object>, rtnMap =, new  HashMap<在();   ,rtnMap.put (“msg",,“hello “, +,名称);   ,return  rtnMap;   }

如果使用@PathVariable以. sh或。蝙蝠等特殊字符结尾,会影响实际返回数据

报错如下:

{   ,“timestamp": 1541405292119,   ,“status": 406年,   ,“error":“Not  Acceptable"   ,“exception":,“org.springframework.web.HttpMediaTypeNotAcceptableException"   ,“message":“Could  not  find  acceptable  representation"   ,“path":“/HDOrg/user/hello/ddf.sh"   }

还是上面的代码

以下代码,省略@RestController控制层类代码

@RequestMapping (value =,“你好/{名称:. *}“)   public  Map<字符串,Object>, sayHello (@PathVariable (“name"), String 名字,,HttpServletRequest 请求),{   ,Map<字符串,Object>, rtnMap =, new  HashMap<在();   ,rtnMap.put (“msg",,“hello “, +,名称);   ,return  rtnMap;   }

如果这时候请求地址为你好/ddf.sh或你好/ddf.com.sh,只要是以. sh结尾,这时候业务逻辑代码不会受到影响,但走到春自己的代码去处理返回数据的时候,有一个功能会根据扩展名来决定返回的类型,而以. sh结尾扩展名为sh,会被解析成对应的内容类型:应用程序/x-sh。

解决办法如下,第一种方法是从网上找到的,可以直接禁用该功能,但有可能会影响到静态资源的访问,不能确定,也没有进行尝试

@ configuration   public  class  Config  extends  WebMvcConfigurerAdapter  {   ,@Override   ,public  void  configureContentNegotiation (   ContentNegotiationConfigurer 才能;配置),{   ,configurer.favorPathExtension(假);   ,}   }

然后以下就是闲着没事很想换个思路尝试去看看这到底是怎么回事,由于个人能力有限,不保证以下内容的重要性;

怎么对@PathVariable中的特殊字符进行处理