vlambda博客
学习文章列表

我们的项目是如何彻底解决Springboot跨域问题的


项目用Springboot写的,和客户端的交互采用了http+json的模式,为了在拦截器当中获得请求数据,从而进行一些签名的校验,我们参考了网上的帖子,加入了RepeatedlyReadRequestWrapper。


如果不加入这个,我们在拦截器当中从流当中拿到数据,到了Controller当中,request当中的数据就已经被清空了。


加这个的原因是为了针对部分请求过来的时候,我们从流当中拿到数据,然后再通过这个RepeatedlyReadRequestWrapper把数据复制一份放回流当中,这样Controller就能拿到数据了。


这个过程就不专门发帖了,网上很多。如下的链接就可以

https://www.cnblogs.com/alter888/p/8919865.html



而针对跨域的配置,我们只需要建立一个CorsFilter即可,主要代码如下:

加入这样的跨域后,结合上述的RepeatedlyReadRequestWrapper,我们发现H5请求还是存在跨域问题——具体什么问题,因为项目各种紧张,所以我们当时采取了如下做法:

是对于H5请求的特定路径,不走拦截器统一验签,对于这些路径,我们还是使用普通的ServletRequest request,这样拦截器不拿数据,直接到Controller去拿,所谓的验签也需要在Controller来做,这样一份验签的代码,会至少存在两个入口,这对于写代码而言,是极其不好的。



今天经过和前端沟通,发现,原来H5的跨域请求,会先发一个OPTIONS请求,发完之后,才会进行真正的请求。

如果是因为这个原因,那么解决问题就容易多了,在拦截器当中只要收到OPTIONS请求,直接返回成功。

我们的项目是如何彻底解决Springboot跨域问题的

另外在RepeatedlyReadRequestWrapper对应的过滤器RepeatedlyReadFilter加入了如下代码:

我们的项目是如何彻底解决Springboot跨域问题的

那么也直接走ServletRequest request。

至此,跨域问题在Springboot当中的问题彻底解决!


至于说在SpringCloud还套了一层gateway是如何解决跨域问题、以及跨域之后哪些安全问题需要注意的,另外的帖子再说。


我们的项目是如何彻底解决Springboot跨域问题的

神游坐忘峰大话IT