SpringBoot+React实现短链接重定向时静态资源被拦截问题求解
问题原因
Spring MVC默认的路径匹配优先级规则中,Controller内定义的通配路径/{shortUrl}优先级高于静态资源的默认匹配规则,因此带后缀的静态资源请求(如main.css)会优先触发短链解析接口,而不会被Spring识别为静态资源请求。
你当前代码中会直接将shortUrl强转为Long类型,非数字的静态资源文件名就会抛出NumberFormatException异常。
可行解决方案
下面按实现成本从低到高排序:
方案1:给路径变量增加正则匹配(最推荐,改动最小)
你当前的短链实际是纯数字ID,直接在路径映射上增加正则规则,只匹配纯数字的路径变量即可:
// 仅匹配全数字的路径参数,非数字的请求不会进入该方法 @GetMapping(value = "/{shortUrl:\\d+}") public ResponseEntity<String> redirectTinyurl(@PathVariable String shortUrl) { // 原有逻辑不变 }
如果你后续要改成字母+数字的短链(如aBcD格式),可以修改正则为仅匹配大小写字母和数字,同时可以限定长度(比如你生成的短链都是4位):
// 仅匹配4位大小写字母+数字的路径参数 @GetMapping(value = "/{shortUrl:[a-zA-Z0-9]{4}}")
所有带.、下划线等特殊字符的静态资源文件名都不会匹配该规则,会自动走Spring静态资源处理逻辑。
方案2:调整静态资源匹配优先级
如果你不想限制短链的格式,可以配置静态资源的匹配优先级高于Controller通配路径,Spring会先检查请求是否对应静态目录下的文件,存在则直接返回,不存在才进入短链解析接口:
- 新增Web配置类:
import org.springframework.core.Ordered; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") // 指向静态资源存放目录 .addResourceLocations("classpath:/static/") // 设置为最高优先级,先匹配静态资源再匹配Controller路径 .setOrder(Ordered.HIGHEST_PRECEDENCE); } }
- 你也可以在配置文件中指定静态资源的路径前缀,比如所有静态资源都走
/static/前缀,就不会和根路径的短链冲突:
# application.properties配置 spring.web.resources.static-locations=classpath:/static/ spring.mvc.static-path-pattern=/static/**
对应修改index.html中的资源引用路径:
<link rel="stylesheet" href="/static/main.css" /> <script src="/static/built/bundle.js"></script>
方案3:给短链增加统一前缀
如果可以接受短链不是直接在根路径,新增一个统一前缀比如/s/,彻底避免路径冲突:
// 短链路径改为 http://localhost:8080/s/aBcD @GetMapping(value = "/s/{shortUrl}") public ResponseEntity<String> redirectTinyurl(@PathVariable String shortUrl) { // 原有逻辑不变 }
该方案完全不会和静态资源、其他接口路径冲突,是生产环境最常用的实现方式。
内容的提问来源于stack exchange,提问作者CrispyLips
相关产品推荐
相关产品推荐

