spring boot @PathVariable 避免最后点号.之后的内容被截断
问题描述
使用spring boot,定义一个搜索的请求,如下。
@RequestMapping(path = "/{keywords}", method = RequestMethod.GET)
public String index(@PathVariable("keywords") String keywords) {
logger.info(keywords);
return "result";
}
使用以下 url 访问,打印输出结果:
url 输入/google
,keywords 显示google
url 输入/google.com
,keywords 显示google
url输入/cloud.google.com
,keywords 显示cloud.google
可以看到带点号"."的路径,最后一个点号"."后面的参数内容丢失了。以下介绍2种解决方法。
解决方法1
将注解 @RequestMapping 的 path 设置为 {keywords:.+}
,匹配点号".",避免点号被截取。
@RequestMapping(path = "/{keywords:.+}", method = RequestMethod.GET)
public String index(@PathVariable("keywords") String keywords) {
logger.info(keywords);
return "result";
}
解决方法2
配置 extends WebMvcConfigurerAdapter 类,重写configurePathMatch
方法,设置 setUseSuffixPatternMatch
为 false。
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
查看setUseSuffixPatternMatch
的源代码如下。默认情况下为true,/users.php
等价于/users
,导致了接收到的路径参数被删除,设置为false
即可。
/**
* Whether to use suffix pattern match (".*") when matching patterns to
* requests. If enabled a method mapped to "/users" also matches to "/users.*".
* <p>By default this is set to {@code true}.
* @see #registeredSuffixPatternMatch
*/
public PathMatchConfigurer setUseSuffixPatternMatch(Boolean suffixPatternMatch) {
this.suffixPatternMatch = suffixPatternMatch;
return this;
}