在一次紧急开发中,(基于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多
但是 ,, 但是 ,, 上线后(用了三台服务器部署),运维告诉 系统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异常。