调用HandlerInterceptorAdapter子类的postHandle方法时,ModelAndView为null

有趣的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;
    }
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 28,018评论 1 45
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 7,378评论 0 7
  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 8,917评论 1 19
  • 函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。malloc()函数有一个参数,...
    诸事圆成阅读 2,144评论 0 0
  • 【药品名称】注射用双氯芬酸钠利多卡因 【适应症】本品为镇痛药,主要用于下列疾病引起的疼痛。 肌肉、关节、关节囊、滑...
    七月上leaf阅读 3,764评论 0 0