上面提到了非简单请求,那什么是非简单请求呢,可以看下面的图:
非简单请求会发出一个预检命令的(当然了,我们上面的Filter已经解决预检命令的问题了):
Spring框架解决
如果使用的是Spring框架的话,那就只需要一个注解就能够解决跨域的问题了:@CrossOrigin
HTTP服务器层
我们在的商用开发中,一般请求的过程是这样的:浏览器->HTTP服务器(Nginx,Apache)->应用服务器(Tomcat,Weblogic)
上面编写的Filter、Spring框架都是在应用服务器上解决的,我们也是可以通过HTTP服务器(Nginx,Apache)来进行解决跨域问题的!
Nginx我用过,Apache我倒是还没用过,下面就简单记录了Nginx和Apache是如何配置的:
Nginx配置:
Apache配置:
代理解决跨域问题
在之前的图我们已经看到了,解决跨域的问题可以在“调用方”中来进行解决。
“调用方”解决跨域的问题是这个思路的:让发送出去的请求代理成是本域的
举个例子:
www.zhongfucheng.top是调用方 www.zhongfucheng.site是被调用方
它俩是不同域的,但我们可以在nginx或Apache上进行配置代理:将被调用方www.zhongfucheng.site映射成别的路径
比如,像下面的图,将8080端口的映射成了ajaxServer,当调用方访问ajaxServer路径时,这样的方法在外部看起来就不像是跨域了,像是访问本地(8081端口),但实际访问别的域(8080端口)
总结
令我感到最简单的是通过Spring的注解就可以解决跨域的问题了,JSONP的方式已经是很少用的了,因为存在一定的弊端,但了解一下也无妨,毕竟可能面试的时候会问到。当没有用任何框架的时候,写Filter也不麻烦,也只是配置了一下HTTP头信息而已。如果使用Nginx、Apache时,也可以用代理或者配置HTTP头信息都可以解决。看完之后,有没有觉得跨域问题就迎刃而解了。