2016年 6月 27日
Spring MVC的跨域资源共享(CORS)的使用方法及实现机制
Spring MVC的CORS配置方式
参考:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#cors
方式一:针对Controller或者RequestMapping的注解方式
可以使用@CorssOrigin
进行配置,可以针对RequestMapping:
也可以针对Controller:
双层控制:
方式二:javaConfig全局配置
方式三:xml全局配置
Spring MVC CORS的实现机制
实现机制
在DispatcherServlet
的doDispatch
方法中,代码会调用getHandler
方法,这个方法迭代handlerMappings
列表并分别调用列表中各个HandlerMapping的HandlerMapping.getHandler
方法。
在AbstractHandlerMapping#getHandler#getHandler
方法中可以看到,它使用了CorsUtils#isCorsRequest
判断当前request是否为跨域请求,如果是的话,会调用自己的getCorsHandlerExecutionChain
方法:
而在getCorsHandlerExecutionChain
中可以看到,它首先判断当前请求是否为Http Pre-Flight请求,如果不是,则向executionChain中增加拦截器CorsInterceptor
:
我们可以在同文件中(AbstractHandlerMapping
)看到CorsInterceptor
为private的class。它的唯一任务就是调用corsProcessor.processRequest
来为request注入跨域头:
关于DefaultCorsProcessor
的源代码就不贴了,请自行阅读。
坑
特别注意!
这个CorsInterceptor
拦截器是动态追加在整个拦截器列表的最后的!
这个CorsInterceptor
拦截器是动态追加在整个拦截器列表的最后的!
这个CorsInterceptor
拦截器是动态追加在整个拦截器列表的最后的!
重要的事情说3遍。所以如果你在拦截器里面抛出Exception的话,就别希望它来帮你加跨域的头了!!!