`
jinnianshilongnian
  • 浏览: 21503329 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2418512
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008682
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5639392
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259906
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597274
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250212
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858852
Group-logo
跟我学Nginx+Lua开...
浏览量:701954
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785160
社区版块
存档分类
最新评论

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

 
阅读更多

spring3.2.3已经修复该bug

 

问题描述:

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

分享到:
评论
15 楼 乗着风飛 2016-09-12  
请问一下我spring MVC  的访问链接后面  加个 点 为什么没有影响呢  比如  ../login.  和../login  和  ../login.adfasdfasdf  效果是一样的  为啥子呢
14 楼 jinnianshilongnian 2013-05-21  
spring3.2.3已经修复该bug
13 楼 jinnianshilongnian 2013-05-10  
jakejone 写道
你又帮到我了。。。。。谢谢

12 楼 jakejone 2013-05-10  
你又帮到我了。。。。。谢谢
11 楼 noedge86 2013-04-16  
飞天奔月 写道
jinnianshilongnian 写道
noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

按理说是没有 为什么有这种需求



noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?



有个可以拿到当前请求 最匹配的pattern, 应该能满足你的需求

	/**
	 * 获得最佳的HandlerMapping映射内的匹配模式。
	 * 
	 * @param request
	 * @return
	 */
	public static String getBestMatchingPattern(HttpServletRequest request){
		String bestMatchingPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
		return bestMatchingPattern;
	}




真的可以呀!原来处理过后,它把这个信息放在request里面呀。聪明呀!非常感谢!看来还得多读源码呀!向两位学习!
10 楼 jinnianshilongnian 2013-04-15  
飞天奔月 写道
jinnianshilongnian 写道
noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

按理说是没有 为什么有这种需求



noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?



有个可以拿到当前请求 最匹配的pattern, 应该能满足你的需求

	/**
	 * 获得最佳的HandlerMapping映射内的匹配模式。
	 * 
	 * @param request
	 * @return
	 */
	public static String getBestMatchingPattern(HttpServletRequest request){
		String bestMatchingPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
		return bestMatchingPattern;
	}



+1
9 楼 飞天奔月 2013-04-14  
jinnianshilongnian 写道
noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

按理说是没有 为什么有这种需求



noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?



有个可以拿到当前请求 最匹配的pattern, 应该能满足你的需求

	/**
	 * 获得最佳的HandlerMapping映射内的匹配模式。
	 * 
	 * @param request
	 * @return
	 */
	public static String getBestMatchingPattern(HttpServletRequest request){
		String bestMatchingPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
		return bestMatchingPattern;
	}


8 楼 jinnianshilongnian 2013-04-08  
noedge86 写道
我再请求个问题:

/getxxxx/11/22 --> /getxxxx/{a}/{b}

spring mvc在匹配的时候,是不是先把{a},{b}替换成*,转成Ant path格式后,再进行匹配呢?

是的
7 楼 noedge86 2013-04-08  
jinnianshilongnian 写道
noedge86 写道
jinnianshilongnian 写道
noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

按理说是没有 为什么有这种需求


我想做一个简单的权限控制的功能,初步的想法是根据请求URI获得ant path后到DB去对比,看当前用户是否有访问它的权限。

是这样的 那就直接 /* /** 之类的模式匹配不久行了?


突然想通了,使用AntPathMatcher就可以了。你这个方法可行呀!
6 楼 noedge86 2013-04-08  
我再请求个问题:

/getxxxx/11/22 --> /getxxxx/{a}/{b}

spring mvc在匹配的时候,是不是先把{a},{b}替换成*,转成Ant path格式后,再进行匹配呢?
5 楼 noedge86 2013-04-08  
jinnianshilongnian 写道
noedge86 写道
jinnianshilongnian 写道
noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

按理说是没有 为什么有这种需求


我想做一个简单的权限控制的功能,初步的想法是根据请求URI获得ant path后到DB去对比,看当前用户是否有访问它的权限。

是这样的 那就直接 /* /** 之类的模式匹配不久行了?


好吧,我再想想。如果实在不行,就规定每个请求上来都要带一个确定的标识,再通过标识到DB里对比。

非常感谢你的帮忙!
4 楼 jinnianshilongnian 2013-04-08  
noedge86 写道
jinnianshilongnian 写道
noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

按理说是没有 为什么有这种需求


我想做一个简单的权限控制的功能,初步的想法是根据请求URI获得ant path后到DB去对比,看当前用户是否有访问它的权限。

是这样的 那就直接 /* /** 之类的模式匹配不久行了?
3 楼 noedge86 2013-04-08  
jinnianshilongnian 写道
noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

按理说是没有 为什么有这种需求


我想做一个简单的权限控制的功能,初步的想法是根据请求URI获得ant path后到DB去对比,看当前用户是否有访问它的权限。
2 楼 jinnianshilongnian 2013-04-07  
noedge86 写道
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

按理说是没有 为什么有这种需求
1 楼 noedge86 2013-04-07  
你好,如何通过一个请求uri获取到匹配成功的 ant path:
比如:http://localhost/proj/user/11
根据user/11,得成/user/{userId}

有办法吗?

相关推荐

    spring3.2参考文档

    Spring 3.2 是该框架的一个重要版本,引入了许多改进和新特性。这份文档将深入探讨Spring 3.2的主要概念、功能和最佳实践。 1. **核心容器**:Spring的核心在于其IoC(Inversion of Control)和DI(Dependency ...

    spring3.2源码包

    Spring 3.2 版本是该框架的一个重要里程碑,它在前几个版本的基础上进行了许多改进和优化,旨在提高开发效率、可维护性和性能。下面我们将详细探讨Spring 3.2框架的核心特性、主要模块以及它们如何协同工作。 首先...

    spring3.2 源码 jar包

    最后,深入理解Spring源码不仅可以帮助你解决实际开发中的问题,还能让你更好地掌握Java企业级应用的开发技巧,为你的职业生涯增色添彩。因此,花时间研究这个源码jar包是非常值得的投资。祝你在学习Spring的道路...

    spring v3.2源码

    个人觉得spring3.2的源代码比较好编译,没啥脾气,像我之前下载的spring的最新版本源代码,还有spring4.0的源代码,不论是使用jdk1.6还是1.7甚至是1.8编译都出问题,结果还是觉得spring3.2编译过程轻松一点,配合...

    Spring3.2包和配置文件

    Spring 3.2 是一个重要的Java企业级框架,主要用于构建高度模块化和可维护的Java应用程序。这个版本的Spring框架提供了许多改进和新特性,旨在提高开发效率和应用的灵活性。在Spring 3.2中,主要包含了四个关键模块...

    spring3.2最全jar包

    在实际开发中,使用这个“spring3.2最全jar包”可以确保你拥有所有必要的库,避免了因为缺少某个jar而引发的类加载问题。同时,这个版本也考虑到了与其他开发工具的兼容性,使得开发过程更加顺畅。

    spring3.2jar包

    Spring 3.2 是该框架的一个重要版本,它提供了许多增强的功能和改进,为开发者提供了更高效、更灵活的开发体验。本篇文章将深入探讨Spring 3.2 jar包中的关键知识点及其在J2EE开发中的应用。 首先,Spring的核心...

    spring3.2 编译后源码

    Spring 3.2 版本是该框架的一个重要里程碑,引入了许多增强功能和改进。在这个版本中,开发者可以深入理解 Spring 的工作原理,从而更好地利用其特性来优化应用程序。 首先,Spring 3.2 对于核心容器(Core ...

    Spring 3.2 Eclipse 源文件

    通过下载的"spring-framework-3.2.x"压缩包,开发者可以在Eclipse中直接导入项目,查看Spring框架的源代码实现,深入理解其设计理念和工作原理,这对于提升个人技能和解决实际问题都大有裨益。同时,这也为自定义...

    spring3.2中文文档

    spring3.2框架是一个轻量级的解决方案和一个潜在的 一站式为构建企业级应用程序。 然而, spring是模块化的,允许你只使用那些你需要的部分, 无需引入其余。 您可以使用IoC容器, Struts在上,但是你也可以只使用 ...

    Spring3.2(Spring-Framework-Reference 3.2)

    在提供的文件内容中,我们可以提取出关于Spring3.2框架的详细知识点。Spring是一个开源的Java/Java EE全功能栈的应用程序框架,它通过提供一系列的工具和库来简化Java应用的开发。文件内容涉及了Spring框架的多个...

    spring3.2 源码编译后需要的jar

    spring3.2 源码编译后需要的jar,spring3.2 源码编译后需要的jar,spring3.2 源码编译后需要的jar

    spring3.2-api.chm

    spring3.2-api.chm格式,本人在网上找了好多chm格式的,都不正常现在,没有办法自己找了一个工具打包成chm格式

    spring3.2 源码编译后需要的jar2

    spring3.2 源码编译后需要的jar,spring3.2 源码编译后需要的jar,spring3.2 源码编译后需要的jar

    spring3.2源码-官方原版.zip

    Spring框架是Java开发中最常用的轻量级框架之一,它的3.2版本因其稳定性和广泛的社区支持而备受青睐。本文将深入探讨Spring 3.2源码中的关键知识点,旨在帮助开发者更好地理解其工作原理,提升代码质量与效率。 ...

    spring3.2源码

    通过深入研究 Spring 3.2 源码,开发者可以更好地理解 Spring 框架的内部机制,从而更高效地利用其功能,解决实际开发中的问题。同时,这也为学习更高级的 Spring 版本,如 Spring Boot 或 Spring Cloud 打下了坚实...

    Spring3.2.zip

    在Spring 3.2中,MVC框架进行了性能优化,支持了更高效的路径匹配和参数解析,同时还增加了对RESTful风格的URL处理支持,提升了Web应用的可维护性和扩展性。 除此之外,Spring 3.2还强化了AOP(面向切面编程)支持...

    spring 3.2jar包

    在下载的"spring3.2"压缩包中,通常包含所有必需的Spring 3.2核心库以及相关模块的jar文件,例如spring-core、spring-context、spring-aop、spring-webmvc等。开发者可以根据具体项目需求选择导入相应的jar包。虽然...

Global site tag (gtag.js) - Google Analytics