事情发生经过是我有次springboot项目中定义了一个遵循restful规则的接口,

@RequestMapping(value = "/xxxx/{email}", method = RequestMethod.GET)
public void xxxtest(@PathVariable String email) {
    System.out.println(email);
}

 

这时候访问的时候http://localhst:8080/xxxx/tets@qq.com

输出的email变成了qq

请求url被“ . “截断了。最终得到的额email的值是qq,而不是qq.com

 

这里要说道一个类,PatternsRequestCondition

里面有两个匹配规则,

 

useSuffixPatternMatch:设置是否是后缀模式匹配,如“/user”是否匹配/user.*,默认真即匹配;

这种模式下.后面加任何后缀,都会被匹配到。user.do,user.html

 

useTrailingSlashMatch:设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认真即匹配;

 

private String getMatchingPattern(String pattern, String lookupPath) {
   if (pattern.equals(lookupPath)) {
      return pattern;
   }
   if (this.useSuffixPatternMatch) {
      if (!this.fileExtensions.isEmpty() && lookupPath.indexOf('.') != -1) {
         for (String extension : this.fileExtensions) {
            if (this.pathMatcher.match(pattern + extension, lookupPath)) {
               return pattern + extension;
            }
         }
      }
      else {
         boolean hasSuffix = pattern.indexOf('.') != -1;
         if (!hasSuffix && this.pathMatcher.match(pattern + ".*", lookupPath)) {
            return pattern + ".*";
         }
      }
   }
   if (this.pathMatcher.match(pattern, lookupPath)) {
      return pattern;
   }
   if (this.useTrailingSlashMatch) {
      if (!pattern.endsWith("/") && this.pathMatcher.match(pattern + "/", lookupPath)) {
         return pattern +"/";
      }
   }
   return null;
}

 

 

默认情况下启动程序,这两个值都是默认true,可以通过在主程序入库

public class xxxApplication extends WebMvcConfigurationSupport {

    @Override
    protected void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
    }

 

通过重写configurePathMatch方法,设置useSuffixPatternMatchuseTrailingSlashMatch的值来达到修改规则的目的

发表评论

电子邮件地址不会被公开。