我们的项目是如何彻底解决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请求,直接返回成功。
另外在RepeatedlyReadRequestWrapper对应的过滤器RepeatedlyReadFilter加入了如下代码:
那么也直接走ServletRequest request。
至此,跨域问题在Springboot当中的问题彻底解决!
至于说在SpringCloud还套了一层gateway是如何解决跨域问题、以及跨域之后哪些安全问题需要注意的,另外的帖子再说。
神游坐忘峰大话IT