Spring MVC不区分大小写的URL

时间:2011-09-13 05:40:31

标签: java spring url case-insensitive

我已经在Google和stackoverflow上找到了答案,但不幸的是,所提供的解决方案要么假设有很多关于Spring MVC和Java的先前知识,要么是关于带注释的不区分大小写。

因此我不确定如何使这些解决方案适应我自己的问题,因此有关于它的新问题的原因。

我想做的事听起来很简单。 我有一个dispatcher-servlet.xml文件,其中包含以下XML块:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="*.htm">pageController</prop>
                <prop key="*.html">pageController</prop>
                <prop key="/cms/*">pageController</prop>
                <prop key="/admin/*">adminController</prop>
            </props>
        </property>
    </bean>

我希望/cms/*/admin/*键不区分大小写,但对Java和Spring MVC都不熟悉,我不明白我应该怎么做。

例如,即使有人键入/CMS//Cms/,我也希望它使用pageController,而目前它只会显示404页。

有人能够向我解释为了达到我想要的结果我必须做些什么吗?

非常感谢任何帮助!

修改

根据 Rupok的回答,我添加了一个扩展AntPathMatcher的类。

不幸的是,我不知道如何“将此设置回SimpleUrlHandlerMapping”。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:5)

SimpleUrlHandlerMapping的默认匹配机制是AntPathMatcher。您可以创建自己的PathMatcher实现,也可以创建AntPathMatcher的子类,并将其设置回SimpleUrlHandlerMapping。

PathMatcher接口非常直接实现。

public class CaseInsensitiveAntPathMatcher extends AntPathMatcher {

@Override
public boolean match(String pattern, String string) {
    return super.match(pattern.toLowerCase(), string.toLowerCase()); // make this according to your need
}

}

答案 1 :(得分:0)

Rupok的回答让我开始朝着正确的方向前进,但我需要稍微改变实施方式才能让它发挥作用。

public class CaseInsensitiveAntPathMatcher extends AntPathMatcher {
    @Override
    protected boolean doMatch(String pattern, String path, boolean fullMatch, Map<String, String> uriTemplateVariables) {
        return super.doMatch(pattern.toLowerCase(), path.toLowerCase(), fullMatch, uriTemplateVariables);
    }
}

match(String,String)和服务器其他方法委托给doMatch(String,String,boolean,Map)。

另外,由于我使用的是org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,我需要像这样插入我的新匹配器

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
    <property name="pathMatcher">
        <bean class="youpackage.CaseInsensitiveAntPathMatcher" />
    </property>
</bean>