Spring通过URL传值不能携带"."???
# Spring通过URL传值不能携带"."???
在开发中暴露的问题,URL携待参数竟然不能包含"."
# 解决方案
将url传值,改为参数传递
- 修改前:
@GetMapping("/{ip}")
public Result getList(@PathVariable("ip") String ip){
return Result.getSuccess(serviceA.getList(ip))
}
1
2
3
4
2
3
4
- 修改后:
@GetMapping("/")
public Result getList(@RequestParam("ip") String ip){
return Result.getSuccess(serviceA.getList(ip))
}
1
2
3
4
2
3
4
# 问题分析
在开发过程中,突然遇到这个问题,发现前端传给后台的字符串被截断
"." 后面的内容后台无法获取
例:
后台接口如下
@GetMapping("/{ip}")
public Result getList(@PathVariable("ip") String ip){
return Result.getSuccess(serviceA.getList(ip))
}
1
2
3
4
2
3
4
前端传值方式如下
http://127.0.0.1/192.168.1.1
1
那么我们再看后台,发现接收到的值为 192.168.1
很奇怪,为什么后面的.1不见了???
我们再来看下SpringMvc的解析方式
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManager">
<constructor-arg>
<array>
<bean class="org.springframework.web.accept.HeaderContentNegotiationStrategy"/>
<!-- 根据后缀名来决定请求的视图类型 -->
<bean class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
<constructor-arg>
<map>
<entry key="xml" value="application/xml" />
<entry key="json" value="application/json" />
<entry key="html" value="text/html" />
<entry key="htm" value="text/html" />
<entry key="txt" value="text/plain" />
<entry key="xls" value="application/vnd.ms-excel" />
</map>
</constructor-arg>
</bean>
</array>
</constructor-arg>
</bean>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
原来,SpringMvc在解析URL的时候,会把最后一个"."和后面的内容解析为后缀,然后进行内容匹配
那么如果你传的参数中,有携待"."的这种场景的话,就只能通过参数来传值了
# 大功告成
OK,那么我们通过上述方式解决了此类问题,在此也算记录一下。
上次更新: 2023/03/24, 08:53:10