美文网首页
调用HandlerInterceptorAdapter子类的po

调用HandlerInterceptorAdapter子类的po

作者: dustheart | 来源:发表于2018-08-30 20:36 被阅读0次

有趣的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;
    }
    
}

相关文章

网友评论

      本文标题:调用HandlerInterceptorAdapter子类的po

      本文链接:https://www.haomeiwen.com/subject/fmpdwftx.html