【问题标题】:How do I restrict route extensions in @RequestMapping paths for Spring MVC controllers?如何限制 Spring MVC 控制器的 @RequestMapping 路径中​​的路由扩展?
【发布时间】:2012-06-08 21:16:34
【问题描述】:

我有一个相当简单的任务想要完成,但似乎找不到有关 Spring MVC 路由的信息。我有一个非常简单的控制器,可以将路径路由到视图:

@Controller
@RequestMapping(value = "/help")
public class HelpController {

    private static final String HELP = "help";

    @RequestMapping(method = RequestMethod.GET)
    public String help(Model model, Locale locale) {
        model.addAttribute("locale", locale);
        return HELP;
    }
}

如果 http://mysite.com/help.some.extension.is.entered 我想抛出 404,但 Spring 似乎将示例解析为 /help。 javadoc 说 @RequestMapping 注释只是一个 servlet URI 映射,但我认为 /help 意味着它需要完全匹配。任何澄清将不胜感激。

【问题讨论】:

    标签: spring-mvc routes uri controllers


    【解决方案1】:

    对于 Spring 4,这很容易解决:

    <mvc:annotation-driven>
        <mvc:path-matching suffix-pattern="false" />
    </mvc:annotation-driven>
    

    所以您仍然可以使用mvc:annotation-driven 进行配置。

    【讨论】:

      【解决方案2】:

      你可以在@RequestMapping注解中提及

      仅与 Servlet URL 模式相同。

      @Controller
      public class HelpController {
      
          private static final String HELP = "help";
      
          @RequestMapping(value = "/help" method = RequestMethod.GET)
          public String help(Model model, Locale locale) {
              model.addAttribute("locale", locale);
              return HELP;
          }
      
          @RequestMapping(value = "help/*" method = RequestMethod.GET)
          public String helpWithExtraWords() {
              return "error";
          }
      }
      

      【讨论】:

      • 感谢您的回复!但是,这并不能解决问题,因为路由前面有 /*。我的目标是在输入 /help.suffix 时返回 404。 Spring 接受句点字符作为 /help 的有效扩展。
      【解决方案3】:

      我能想到的最好方法是明确配置您的 RequestMappingHandlerMapping 以不考虑后缀路径,这样:

      <bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
          <property name="useSuffixPatternMatch" value="false"></property>
      </bean>
      

      但是,如果您使用mvc:annotation-driven 配置了 Spring MVC,这将不起作用,您将不得不扩展整个 handlerAdapter 定义,这并不难,按照这些思路(这不完整,你可以通过org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser查看整个定义):

      <bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
          <property name="webBindingInitializer">
              <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
                  <property name="conversionService" ref="conversionService"></property>
                  <property name="validator">
                      <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
                  </property>
              </bean>
          </property>
          <property name="messageConverters">
              <list>
                  <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
                  <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
                  <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
                  <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
                  <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
                  <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
                  <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
              </list>
          </property>
      </bean>
      
      <bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
          <property name="useSuffixPatternMatch" value="false"></property>
      </bean>
      

      【讨论】:

      • 我在 springsource 论坛上的帖子中尝试了一些非常相似的东西。这似乎没有什么不同。 forum.springsource.org/…
      • 这很奇怪@Roosh,这个配置对我有用,你能确认你已经完全删除了mvc:annotation-driven,并且只有这个handlerMapping。另外,你能告诉我你正在使用的 Spring 版本吗 - Spring 3.0.5 配置与我提供的不同(这是 Spring 3.1+)
      • 我使用的是 Spring 3.0.6。我没有从 spring 文件中删除我的 语句。我会尝试一下,如果它有效,请告诉您。
      • 是的,这应该是@Roosh的原因,在Spring 3.0.6中,第一行应该是&lt;bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&gt;
      【解决方案4】:

      在 Spring 3.0.X 中,您可以使用 useDefaultSuffixPattern 属性。

      <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
          <property name="useDefaultSuffixPattern" value="false" />
      </bean>
      

      您需要删除&lt;/mvc:annotation-driven&gt;

      参考URL Pattern Restricting in SPRING MVC

      【讨论】:

      • 我在删除 时开始收到 servlet 异常。 javax.servlet.ServletException:处理程序没有适配器 [com.myapp.controller.ResourceController@244a0a42]:您的处理程序是否实现了支持的接口,例如 Controller?
      • @Roosh 你也应该使用 ' ' 这会起作用!!跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多