spring3.2 带matrix变量的URL匹配有关问题

spring3.2 带matrix变量的URL匹配问题

问题描述:

1、url可能是

http://localhost:9080/es-web/login

或一个以;开头的matrix变量

http://localhost:9080/es-web/login;JSESSIONID=a3595636-e414-4cff-bd37-a42edf53193d

 

2、控制器处理方法@RequestMapping匹配pattern写法

spring 3.1前,以下写法是没有问题的

@RequestMapping(value = {"/login"}, method = RequestMethod.GET)
    public String loginForm() {
        return "front/login";
    }

 

自spring3.2引入@MatrixVariable来匹配如/category;domId=a这样模式,使用如上pattern匹配『/login;JSESSIONID=a3595636-e414-4cff-bd37-a42edf53193d』时就会报如下错误

写道
java.lang.IllegalStateException: Pattern "/login" is not a match for "/login;JSESSIONID=a3595636-e414-4cff-bd37-a42edf53193d"
at org.springframework.util.Assert.state(Assert.java:385)
at org.springframework.util.AntPathMatcher.extractUriTemplateVariables(AntPathMatcher.java:287)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleMatch(RequestMappingInfoHandlerMapping.java:102)

  

3、解决方案

我们可以使用正则表达式解决

@RequestMapping(value = {"/{login:login;?.*}"}, method = RequestMethod.GET)
public String loginForm() {
    return "front/login";
}

 

有朋友可能觉得如下也是可以的

1、@RequestMapping(value = {"/login", "/login;JSESSIONID=*"}) 

实际是不行的,因为再选择最佳匹配模式时,使用如下代码:

Set<String> patterns = info.getPatternsCondition().getPatterns();
String bestPattern = patterns.isEmpty() ? lookupPath : patterns.iterator().next();

即第一个。所以此时即使配置了两个,也永远选择"/login" (不管顺序如何);如果此处采用fallback也能搞定的。

 

2、修改spring源码,匹配时把『;……』,即分号及后边的去掉(spring3.1就是这么实现的)。

 

综上,在不修改源码的情况下,最简单的就是使用正则表达式模式/{login:login;?.*}

 

 

@MatrixVariable使用请参考

http://jinnianshilongnian.iteye.com/blog/1830409