Spring Boot中/favicon.ico请求触发Access Denied异常的解决方案咨询
解决Spring Boot 3.x中/favicon.ico请求触发的Access Denied日志问题
问题背景
在Spring Boot 3.3.2的REST API应用中,使用浏览器请求接口时,后台TRACE日志会打印Access Denied异常——这是因为浏览器会自动发送/favicon.ico请求,而该请求被Spring Security拦截后,因无匹配的授权规则触发拒绝。同时,旧配置项spring.mvc.favicon.enabled在Spring Boot 2.7后已废弃,直接为/favicon.ico配置.permitAll()会因端点不存在转发到/error端点,创建虚拟端点又不够优雅。
可行解决方案
方案1:将/favicon.ico排除出Spring Security拦截链
直接让/favicon.ico请求不经过Spring Security的过滤器链,从根源上避免权限校验日志。
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .securityMatcher("/**") // 排除/favicon.ico的安全拦截 .requestMatchers(matchers -> matchers.excludingAntMatchers("/favicon.ico")) .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ); return http.build(); } }
方案2:利用静态资源处理器处理请求
在项目中放置一个空的favicon.ico文件,让Spring Boot的静态资源处理器直接响应请求,同时配置Spring Security允许匿名访问该路径,避免转发到/error端点。
- 在
src/main/resources/static/目录下添加一个空的favicon.ico文件(可创建0字节文件) - 修改Security配置:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers("/favicon.ico").permitAll() .anyRequest().authenticated() ); return http.build(); } }
方案3:自定义过滤器提前处理请求
编写一个过滤器,在请求到达Spring Security之前拦截/favicon.ico请求,直接返回204无内容,跳过后续安全校验流程。
@Component public class FaviconFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if ("/favicon.ico".equals(request.getRequestURI())) { response.setStatus(HttpServletResponse.SC_NO_CONTENT); return; } filterChain.doFilter(request, response); } }
方案对比
- 方案1:最简洁高效,完全跳过安全拦截,适合纯API场景(不需要网站图标)
- 方案2:符合Spring Boot静态资源规范,返回合法响应,适合需要兼容浏览器图标准则的场景
- 方案3:灵活性最高,可自定义响应内容或状态码,适合特殊业务需求场景
内容的提问来源于stack exchange,提问作者Gökhan Polat
相关产品推荐
相关产品推荐

