美文网首页
调用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