论坛首页 Java企业应用论坛

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

浏览 4472 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-03-18   最后修改:2013-03-18

问题描述:

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

   发表时间:2013-03-20  
从目前来看 可以认为是个bug
0 请登录后投票
   发表时间:2013-04-01  
确实是bug,将在spring3.2.3 fix,bug地址
https://jira.springsource.org/browse/SPR-10398
https://jira.springsource.org/browse/SPR-10398
0 请登录后投票
   发表时间:2013-06-02  
哎呦。 小张,这个bug还是你提交的啊。 不错不错!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics