spring boot 2.x静态资源会被HandlerInterceptor拦截的因和解决方法
Spring Boot 2.x中静态资源被HandlerInterceptor
拦截的问题通常是由于拦截器配置不正确导致的。HandlerInterceptor
是Spring MVC中用于处理请求拦截的机制,如果配置不当,可能会拦截到静态资源的请求。
原因: 如果拦截器配置为拦截所有请求,例如使用/**
作为映射路径,它会捕获静态资源的请求,导致这些资源无法正常访问。
解决方法:
- 配置拦截器时,正确设定需要拦截的路径,不要包括静态资源的路径。例如,只拦截
/api/**
的请求,而不拦截/static/**
或者/public/**
。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(yourInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/static/**", "/public/**", "/css/**", "/js/**", "/images/**");
}
- 如果你需要对所有请求进行拦截,但要排除静态资源,可以在拦截器中检查请求是否为静态资源,并返回NO\_INTERCEPTOR。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
if (uri.startsWith("/static/") || uri.startsWith("/public/") || uri.startsWith("/css/") || uri.startsWith("/js/") || uri.startsWith("/images/")) {
return true; // 不拦截静态资源
}
// 执行其他拦截逻辑
return false;
}
- 确保静态资源的路径配置在Spring Boot的
application.properties
或application.yml
中,Spring Boot会自动将这些路径映射到对应的文件夹。
# application.properties
spring.resources.static-locations=classpath:/static/,classpath:/public/,file:${spring.servlet.multipart.location}
确保以上步骤后,静态资源应该能够正常访问,而自定义的拦截器只会拦截到需要拦截的请求路径。
评论已关闭