gpt4 book ai didi

java - 避免 Spring Controller 匹配静态内容

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:20 25 4
gpt4 key购买 nike

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

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

此映射存在问题,因为 /images/product/p123.jpg 等静态资源也与该 Controller 匹配,从而导致问题。

因此,根据另一个答案,我添加了一个像这样的过滤器:

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

这将确保 Controller 不会匹配静态资源。但是,现在所有静态资源都没有提供服务,我看到如下消息:

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,添加前缀,我也想避免这种情况。

有什么解决方案可以处理静态资源而不将其发送到 Controller 吗?代码片段将不胜感激。

最佳答案

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

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

尝试像这样改变它:

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

因此 Controller 应更改如下:

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

这将确保您不会匹配 resources/cssresources/imagesresources/js 下的静态资源(或者静态内容路径中的任何内容)。

作为一个附带条件,为了构建正则表达式,我总是使用 REGEX101它为您的正则表达式提供了出色的解释和验证。它还突出显示捕获组!

关于java - 避免 Spring Controller 匹配静态内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39131691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com