在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添加前缀,我也想避免使用。
任何解决方案,以便处理静态资源而不将其发送到控制器? 我们非常感谢您的代码段。
答案 0 :(得分:0)
我相信你改变你的正则表达式就足够了。
首先,如果您已经拥有URI,为什么要使用/
字符?
其次,您有捕获组,请注意在为URI构建正则表达式时必须使用非捕获组。
尝试改变它:
":^(?:(?!^images$|^js$|^css$).)*$"
所以控制器应该改变如下:
@RequestMapping(value = "/{category:^(?:(?!^images$|^js$|^css$).)*$}/{brand}/{article_id}", method = GET)
这将确保您不会匹配resources/css
和resources/images
以及resources/js
下的静态资源(或者您在静态内容路径中的静态资源。
作为一个方面,为了构建正则表达式,我总是使用REGEX101为你的正则表达式提供出色的解释和验证。它还突出了捕获组!