zoukankan      html  css  js  c++  java
  • Ajax请求的跨域(CORS)问题

    用浏览器,通过XHR(XMLHttpRequest)请求向另外一个域名请求数据时。会碰到跨域(CORS)问题。
    CORS:Cross-Origin Resource Sharing 


    什么是跨域?

    简单的来说,出于安全方面的考虑,浏览器页面中的JavaScript无法訪问其它server上的数据,即“同源策略”。而跨域就是通过某些手段来绕过同源策略限制,实现不同server之间的通信。


    哪些情况同意跨域訪问。哪些不同意?见下表,http://www.a.com/a.js訪问下面URL的结果:

    URL 说明 是否同意通信
    http://www.a.com/b.js 同一域名下 同意
    http://www.a.com/script/b.js 同一域名下不同目录 同意
    http://www.a.com:8000/b.js 同一域名。不同port 不同意
    https://www.a.com/b.js 同一域名,不同协议 不同意
    http://70.32.92.74/b.js 域名和域名相应ip 不同意
    http://script.a.com/b.js 主域同样,子域不同 不同意
    http://a.com/b.js 同一域名,不同二级域名(同上) 不同意
    http://www.b.com/b.js 不同域名 不同意


    解决方法:

    主要的解决思路就是利用filter在response中增加一个头"Access-Control-Allow-Origin",比方

    response.setHeader("Access-Control-Allow-Origin", "*");     //同意全部请求
    response.setHeader("Access-Control-Allow-Origin", "http://www.baidu.com:80");    //仅仅同意来自http://www.baidu.com:80的请求,用逗号分开

    详细的解决方式:

    1、自己定义filter。在filter中给response增加header: ("Access-Control-Allow-Origin", "*")

    /**
     * 防止浏览器缓存页面或请求结果
     * @author XuJijun
     *
     */
    public class NoCacheFilter implements Filter {
    
    	@Override
    	public void destroy(){
    	}
    
    	@Override
    	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse)resp;
    
            response.setDateHeader("Expires", -1);
            response.setHeader("Cache_Control", "no-cache");
            response.setHeader("Pragma", "no-cache");
            
            response.setHeader("Access-Control-Allow-Origin", "*");     //同意跨域请求
            
            chain.doFilter(req, resp);
    	}
    
    	@Override
    	public void init(FilterConfig arg0) throws ServletException	{
    	}
    }

    结果图:


    或使用第三方软件包:
    2、http://software.dzhuvinov.com/cors-filter.html
    3、https://github.com/eBay/cors-filter

    或mvnrepository上搜索“cors filter”:http://mvnrepository.com/search?q=cors-filter


    已经过时的解决方法:JSONP

    什么是JSONP?

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,而JSONP(JSON with Padding)则是JSON 的一种“使用模式”,通过这样的模式能够实现数据的跨域获取。


    在同源策略下。在某个server下的页面是无法获取到该server以外的数据的,但img、iframe、script等标签是个例外,这些标签能够通过src属性请求到其它server上的数据。利用script标签的开放策略,我们能够实现跨域请求数据,当然,也须要服务端的配合。

    当我们正常地请求一个JSON数据的时候,服务端返回的是一串JSON类型的数据,而我们使用JSONP模式来请求数据的时候,服务端返回的是一段可运行的JavaScript代码


    參考文章:

    (原创文章。转载请注明转自Clement-Xu的csdn博客:http://blog.csdn.net/clementad/article/details/47008803





  • 相关阅读:
    服务器重启
    aliyun修复漏洞之后,重启php-fpm命令
    数据结构和算法绪论(一)
    微信小程序+微信公众号开发总结
    数字校园项目-学生失联预警系统(三)----数据库设计
    数字校园项目-学生失联预警系统(二)-----项目部署
    数字校园项目-学生失联预警系统(一)
    gdut极路由破解教程
    项目:JavaWeb聊天室(问题汇总)
    项目:点餐系统(问题汇总)
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6801528.html
Copyright © 2011-2022 走看看