关于HandlerInterceptor的坑

在使用自定义的HandlerInterceptor时要格外注意跨域的坑,因为一旦自定义的HandlerInterceptor执行preHandle抛出异常时,会导致interceptorChain中后面的其它HandlerInterceptor的preHandle方法得不到执行,其中会包括一个叫作CorsInterceptor的拦截器(如果你在WebMvcConfigurationSupport中配置了addCorsMappings的话),而CorsInterceptor的作用就是用来进行跨域处理的,CorsInterceptor的preHandle()得不到执行就没法在response中设置cors相关的headers,前端就会出现cors相关的错误。

可能你会想着去调整自定义的HandlerInterceptor与CorsInterceptor的顺序来达到先执行CorsInterceptor的目的,但这是行不通的,自定义的HandlerInterceptor是在项目启动的时候就添加到interceptors里了,而CorsInterceptor是在服务运行时新的请求来到时动态添加到interceptors里的,它的执行顺序永远在自定义的HandlerInterceptor后面。

解决方法可以是在自定义的HandlerInterceptor的preHandle()方法一开始就做类似于CorsInterceptor会做的事情(可以借鉴它的代码),或者去掉WebMvcConfigurationSupport中配置addCorsMappings的方法使用Filter去做跨域处理。

你可能感兴趣的:(java,spring)