一次缺少 favicon.ico 导致系统的异常

在Spring Boot 2.0.2项目中,由于设置了spring.mvc.favicon.enabled=false且未配置自定义ico,导致HTTP请求/[favicon.ico]出现404错误。上线后,系统CPU使用率达到100%,经过排查发现是由于缺少favicon.ico,使得request.getRequestURI().endsWith("/error")始终为真,每次请求后都会触发首页重定向,形成无限循环,最终造成系统性能异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一次紧急开发中,(基于spring boot 2.0.2) ,   本来 spring boot 项目 默认的 favicon.ico 是 一片绿色的小叶子,默认是展示的 ,但是 有人在 spring 配置文件中 添加了一行 spring.mvc.favicon.enabled=false ,也没有配置自己的ico,

spring boot 默认配置是 true

{
  "defaultValue": true,
  "name": "spring.mvc.favicon.enabled",
  "description": "Whether to enable resolution of favicon.ico.",
  "type": "java.lang.Boolean"
},

项目启动日志中有打印:
SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]

也就是系统默认ResourceHttpRequestHandler是处理了/favicon.ico 请求的了 , 如果设置为false ,

而系统没有其他地方配置拦截这种静态资源请求,就会导致404

导致上线后打印了N多 

No mapping found for HTTP request with URI [/favicon.ico]

而这个日志还是warn 级别的  很高了,但是这个本来对系统没有什么影响的,最多就是系统日志变多

但是 ,, 但是 ,, 上线后(用了三台服务器部署),运维告诉 系统cup 异常,一直飙到100% ,也没有任何慢SQL日志 (阈值为1秒 ),打开druid 后 ,发现 那就是SQL执行次数过多了,但是一直不能确定原因 (其中还有被人攻击了一二次),

但是看到druid  URL监控的时间 发现项目首页URL 被人访问异常频繁(相对于其它页面) ,检查后发现代码中有如下:

  添加了一个拦截器

@Override    
public void addInterceptors(InterceptorRegistry registry) {    
    registry.addInterceptor(new UrlInterceptor()).addPathPatterns("/error");    
}  

拦截器内代码逻辑:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
   if(request.getRequestURI().endsWith("/error")) {
      response.sendRedirect("/xxxx/index"); //重定向到首页
      return false;
   }
   return HandlerInterceptor.super.preHandle(request, response, handler);
}

(代码其实是有问题的,先不说了)

问题找到了,缺少 ico,导致 request.getRequestURI().endsWith("/error") 一直成立,基本上任何新请求过来处理完后附带了一个新的请求 /favicon.ico , 而这个东西没有被拦截器拦截了, 导致一直返回首页,才会导致首页异常。才会导致系统CPU异常。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值