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

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

spring boot 默认配置是 true

一次缺少 favicon.ico 导致系统的异常_第1张图片

{
  "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异常。




你可能感兴趣的:(springboot)