避免使用Spring控制器来匹配静态内容

时间:2016-08-24 19:34:54

标签: java spring controller resources

在SpringBoot应用程序(v.1.4.0)中,我有一个带有以下注释的控制器:

@RequestMapping(value = "/{category}/{brand}/{article_id}", method = GET)

此映射存在问题,因为像/images/product/p123.jpg这样的静态资源也与该控制器匹配,从而导致问题。

所以,根据另一个答案,我添加了一个这样的过滤器:

@RequestMapping(value = "/{category:^(?!.*\(^)(/images|/js|/css)($)).*}/{brand}/{article_id}", method = GET)

将确保控制器与静态资源不匹配。但是,现在没有提供所有静态资源,我看到如下消息:

2016-08-24 21:24:56.670  WARN 10562 --- [nio-8080-exec-6] o.s.web.servlet.PageNotFound             : No mapping found for HTTP request with URI [/images/product/p123.jpg] in DispatcherServlet with name 'dispatcherServlet'
2016-08-24 21:24:56.671  WARN 10562 --- [nio-8080-exec-6] o.s.web.servlet.PageNotFound             : No mapping found for HTTP request with URI [/images/product/p124.jpg] in DispatcherServlet with name 'dispatcherServlet'

可怕的解决方案是拥有像

这样的路径
@RequestMapping(value = "/{category}/{brand}/{article_id}/", method = GET)

(请注意uri末尾的/),但我个人会避免这种情况! 另一种方法是更改​​uri添加前缀,我也想避免使用。

任何解决方案,以便处理静态资源而不将其发送到控制器? 我们非常感谢您的代码段。

1 个答案:

答案 0 :(得分:0)

我相信你改变你的正则表达式就足够了。

首先,如果您已经拥有URI,为什么要使用/字符? 其次,您有捕获组,请注意在为URI构建正则表达式时必须使用非捕获组。

尝试改变它:

":^(?:(?!^images$|^js$|^css$).)*$"

所以控制器应该改变如下:

@RequestMapping(value = "/{category:^(?:(?!^images$|^js$|^css$).)*$}/{brand}/{article_id}", method = GET)

这将确保您不会匹配resources/cssresources/images以及resources/js下的静态资源(或者您在静态内容路径中的静态资源。

作为一个方面,为了构建正则表达式,我总是使用REGEX101为你的正则表达式提供出色的解释和验证。它还突出了捕获组!