有趣的bug
浏览器可以正常访问后台,但当打开Chrome的开发者工具时,后台会调用HandlerInterceptorAdapter子类的postHandle方法,并且ModelAndView为null,会报空指针异常。更有趣的是,开启火狐的firebug却不会报错。
bug的触发条件为何如此新奇
打开Chrome的开发者工具或者火狐的firebug,浏览器会请求获取压缩js、css对应的map文件,当服务器端没有对应的静态资源时,会进入拦截器HandlerInterceptorAdapter,此时的HttpServletRequest为/error。
可以通过下图的设置,取消浏览器对map文件的请求
取消对map文件的请求.png为什么Chrome报错,火狐却不报错
Chrome请求map文件Request的Header.png 火狐请求map文件Request的Header.png对比两个浏览器请求map文件的请求头,发现火狐的请求头多了accept参数,所以火狐获取map文件的请求进入HandlerInterceptorAdapter子类的postHandle方法时,ModelAndView不为null。可以通过Postman模拟请求得证。
解决办法
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainsiteErrorController implements ErrorController {
private static final String ERROR_PATH = "/error";
@RequestMapping(value=ERROR_PATH)
public String handleError(){
return "errorpage/error";
}
@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
网友评论