如何在 Spring MVC 中使用带注释的映射来实现不区分大小写的 URL
我已经通过我的 spring mvc Web 应用程序很好地注释了映射,但是它们区分大小写。我找不到一种方法使它们不区分大小写。 (我很乐意在 Spring MVC 中实现这一点,而不是以某种方式重定向流量)
I have annotated mappings working great through my spring mvc web app, however, they are case sensitive. I cannot find a way to make them case insensitive. (I'd love to make this happen within Spring MVC, rather than redirecting traffic somehow)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
Spring 4.2将支持不区分大小写的路径匹配。您可以按如下方式配置:
Spring 4.2 will support case-insensitive path matching. You can configure it as follows:
根据 this webpost 您需要添加HandlerMapping< /a> 和
因此,您需要覆盖 PathMatcher 用于映射器和适配器。
Ex(将使所有 @Controller 不区分大小写):
新匹配器:
applicationContext.xml:
添加与 <mvc:annotation-driven>会做的。 (感谢大卫·帕克斯提供的链接)
According to this webpost you need to add both a HandlerMapping and a HandlerAdapter in Spring MVC. The Mapping maps the request to a corresponding controller, and the adapter is responsible to execute the request using the controller.
You therefore need to override the PathMatcher for both the mapper and adapter.
Ex (will make all @Controllers case-insensitive):
New Matcher:
applicationContext.xml:
Added about the same that <mvc:annotation-driven> would do. (Thanks to David Parks for the link)
在 Spring 3.2+ / Spring Boot 中,您现在可以使用简化的 Java 配置设置不区分大小写的 URL 匹配。
首先,您需要创建 CaseInsensitivePathMatcher.groovy 或 Java 类:
接下来,为了实现这一点,您应该有一个用 Springs @Configuration 注释的类,该类扩展了 WebMvcConfigurerAdapter 类,如下所示(请注意,我的代码包含在 . groovy 类,因此示例中不需要“return”关键字):
然后将以下 2 个方法添加到类中:
就是这样,您现在应该已经用最少的配置完成了不区分大小写的 URL 的所有设置
In Spring 3.2+ / Spring Boot, you can now set up case insensitive URL matching using the simplified Java config.
First you need to create the CaseInsensitivePathMatcher.groovy or Java class:
Next, to make this happen, you should have a class annotated with Springs @Configuration that extends the WebMvcConfigurerAdapter class as shown below (Note that my code is contained within .groovy classes, hence the 'return' keyword is not required in the example):
Then add the following 2 methods to the class:
That's it, you should now be all setup for case insensitive URL's with minimal configuration
Spring从5.3版本开始默认不再使用PathMatcher,而是使用PathPatternMatcher。要配置 PathPatternMatcher,请执行以下操作:
Spring since version 5.3 does not use PathMatcher anymore by default, it uses PathPatternMatcher instead. To configure PathPatternMatcher, do the following:
Spring 4.2 中的 bean 文件示例,仅支持 v4.2+:
Example from a bean file in Spring 4.2 and this is ONLY SUPPORTED v4.2+:
由于 WebMvcConfigurerAdapter 已被弃用并且 Java 8 在接口中引入了默认方法的概念,因此您可以实现 WebMvcConfigurer 接口来完成工作。
Since WebMvcConfigurerAdapter is deprecated and Java 8 brought the concept of default methods in interface, You can implement WebMvcConfigurer interface to get the work done.
smat 的解决方案
在 smat 的解决方案,有一点副作用(我会为此责怪 spring-mvc)。
首先,
AntPathMatcher.doMatch()
似乎根据requested-url 和controller-method 的请求映射字符串返回true/false(这是这里唯一应该做的事情)。但是,此方法还用于另一个目的(未在 文档!)。另一个目的是收集controller-method中@PathVariable
对应的值。这些值被收集在Map中。 uriTemplateVariables
(最后一个参数)。这些收集的值用于作为参数值传递给控制器方法。例如,我们有这样的控制器方法,
如果我们使用 URL 访问,
/code/AbD
然后使用 smat 的解决方案
AntPathMatcher.doMatch()
将收集Map中的
为@PathVariable
值uriTemplateVariablesuserCode->abd
。由于我们将路径字符串设为小写,因此收集的值也是小写的。这个小写的 userCode 值被传递到我们的控制器。但是,我很感谢 smat 的解决方案 到目前为止,它对我来说效果很好,没有任何其他问题。
解决方案
通过解决smat 的解决方案。如果扩展
AntPathMatcher
类中没有小写路径或模式字符串,我强制扩展AntPathMatcher
使用自定义AntPathStringMatcher
。我的自定义AntPathStringMatcher
执行不区分大小写的匹配,而不更改实际字符串的大小写。在下面的解决方案代码中,大部分代码是从原始类代码复制的(我想要自定义的代码由于私有访问而对子类隐藏)。
自定义 AntPathMatcher,
}
自定义 AntPathStringMatcher,
Problem report for solution by smat
In solution by smat, there is one little side-effect (I would blame spring-mvc for that).
At first,
AntPathMatcher.doMatch()
seems to return true/false depending on requested-url and controller-method's request-mapping string (That's the only thing should be done here). But, this method is used for one more purpose as well (which is not written in documentation!). Another purpose is to collect corresponding values for@PathVariable
in controller-method. These values are collected inMap<String, String> uriTemplateVariables
(last parameter).And these collected values are used to pass to controller-method as parameter value.For example, we have controller-method like this,
and if we access with URL,
/code/AbD
then with solution by smat
AntPathMatcher.doMatch()
will collect@PathVariable
value inMap<String, String> uriTemplateVariables
asuserCode->abd
. As we are lower-casing the path string, values collected are also lower-cased. And this lower-cased userCode value is passed to our controller.But, I am thankful to solution by smat which served me well so far without any other problems.
Solution
Solved this problem by doing work around solution by smat. Without lower-casing path or pattern string in extended
AntPathMatcher
class, I forced my extendedAntPathMatcher
to use my customAntPathStringMatcher
. my customAntPathStringMatcher
does case-insesitive matching without changing the case of actual string.In following solution code most of the code is copied from original class code(code I wanted to customize was hidden for subclass because of private access).
Custom AntPathMatcher,
}
Custom AntPathStringMatcher,
好吧,我无法回答你的问题(我试过了,我想我能弄清楚)。但是鉴于您在两天内没有收到任何回复,这里至少有一些线索:
这个例子似乎表明这是可能的:
http://webcache.googleusercontent.com/search?q=cache:ELj-ZQ8G4z0J:www.springbyexample.org/examples/sdms-simple-spring-mvc-web-module.html+ case+insensitive+requestmapping+spring&cd=3&hl=en&ct=clnk&client=firefox-a
它在 Spring 中引用了这个类
http://static.springsource.org/spring/docs/ 3.0.4.RELEASE/javadoc-api/org/springframework/web/servlet/mvc/support/ControllerClassNameHandlerMapping.html
我的猜测(这只是一个猜测),你需要扩展
并使用正确的参数实现各个 bean,使其不区分大小写。请参阅:http://rapid-web.tumblr.com /post/296916668/what-does-annotation-driven-do
最后一点,我在阅读的其他地方注意到它说所有路径默认为小写,您是否验证了
/MyPath 不是由
@RequestMapping("/mypath")
处理的吗?再说一次,我只是尽我所能做一些深思熟虑的事情。也许它会让你走得足够远,提出一个更具体的问题,引导你找到答案——有时这些事情就是这样运作的。祝你好运!
Well, I can't answer your question (I tried, I thought I could figure it out). But seeing as you haven't received any responses in 2 days, here are some leads at least:
This example seems to suggest it's possible:
http://webcache.googleusercontent.com/search?q=cache:ELj-ZQ8G4z0J:www.springbyexample.org/examples/sdms-simple-spring-mvc-web-module.html+case+insensitive+requestmapping+spring&cd=3&hl=en&ct=clnk&client=firefox-a
It references this class in Spring
http://static.springsource.org/spring/docs/3.0.4.RELEASE/javadoc-api/org/springframework/web/servlet/mvc/support/ControllerClassNameHandlerMapping.html
My guess (and it's just that, a guess), is that you need to expand
<mvc:annotation-driven/>
and implement the individual beans with the correct parameters to make it case-insensitive. See:http://rapid-web.tumblr.com/post/296916668/what-does-annotation-driven-do
A last note, I noticed somewhere else in reading that it said that all paths default to lower case, have you verified that
/MyPath
isn't handled by@RequestMapping("/mypath")
?Again, just food for thought as best I can do. Maybe it'll get you far enough along to ask a more specific question that leads you to the answer - that's how these things work sometimes. Good luck!
您可以使用以下解决方案
You can use the following solution