问题描述:
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)
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使用请参考