这期内容当中小编将会给大家带来有关怎么对@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(假); ,} }
然后以下就是闲着没事很想换个思路尝试去看看这到底是怎么回事,由于个人能力有限,不保证以下内容的重要性;