项目出现跨域问题,如何解决

Posted TGB-Earnest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目出现跨域问题,如何解决相关的知识,希望对你有一定的参考价值。

现象

昨天在做下载图片的时候,出现下图的现象. 昨天在做下载图片的时候,出现下图的现象.

后端数据库存储的是图片的url,要根据这个url请求图片服务器得到图片进行下载。

为什么会出现跨域?

像上面的情况就会出现跨域,但是这个请求已经发出去了。服务端也就收到并处理了,但是返回的响应结果不是浏览器想要的结果,所以浏览器将这个响应的结果给拦截了,是浏览器的同源策略。

浏览器的同源策略(什么是同源策略)

如果两个URL都 协议、域名、端口三者相同即为同源

有哪些是不受同源策略限制
● 页面上的链接,比如a链接。
● 重定向
● 表单提交
● 跨资源的引入,比如:script ,img , link , iframe

如何解决跨域

CORS 解决跨域

CORS是一个W3C标准,全称是“跨域资源共享”(Cross-origin resource sharing)
它允许浏览器向跨域服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制
在b.com里面添加响应头声明允许a,com访问,代码:

	Access-Control-Allow-Origin: http://a.com

然后a.com就可以用ajax获取b.com里的数据了

具体到Java项目里面

使用Filter方式进行设置
使用Filter过滤器来过滤服务请求,向请求端设置Response Header(响应头部)的Access-Control-Allow-Origin属性声明允许跨域访问。

@WebFilterpublic class CorsFilter implements Filter       
@Override    
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException           HttpServletResponse response = (HttpServletResponse) res;          response.setHeader("Access-Control-Allow-Origin", "*");          response.setHeader("Access-Control-Allow-Methods", "*");          response.setHeader("Access-Control-Max-Age", "3600");          response.setHeader("Access-Control-Allow-Headers", "*");        response.setHeader("Access-Control-Allow-Credentials", "true");        chain.doFilter(req, res);        

同理也可以在nginx,网关上面解决。但都是设置跨域资源共享,只是实现方式不同。

JSONP解决跨域

什么是 JSONP,举个例子,就是 http://a.com/jsonp.html 想要获取 http://b.com/main.js 的数据,这个时候由于浏览器同源策略,是获取不到数据的,所以我们可以在 http://a.com/jsonp.html 创建一个 script 脚本,http://b.com/main.js?callback=xxx。在main.js中调用这个回调函数xxx,并且以JSON数据形式作为参数传递,完成回调。我们来看看代码:

// a.com/jsonp.html中的代码
	  function addScriptTag(src)  
	       var script = document.createElement('script'); 
	       script.setAttribute("type","text/javascript"); 
	       script.src = src; 
	      document.body.appendChild(script);
	  
	  window.onload = function ()  
	      addScriptTag('http://b.com/main.js?callback=foo');
	   //window.onload是为了让页面加载完成后再执行
	  function foo(data)  
	        console.log(data.name+"欢迎您");
	  ;
	 
	//b.com/main.js中的代码
	foo(name:"hl")

存在以下几点问题:
● 只能使用 GET 请求方式,无法使用 POST 请求方式。
● 可能被注入恶意代码,篡改页面内容,可以采用字符串过滤来规避此问题。

以上是关于项目出现跨域问题,如何解决的主要内容,如果未能解决你的问题,请参考以下文章

前后端分离项目,如何解决跨域问题?

vue项目中常用解决跨域的方法

跨域请求(CORS)要点

前后端分离项目,如何解决跨域问题?

http跨域预检问题

为什么会有跨域的问题出现,如何解决跨域问题