跨域问题随笔

什么是跨域? 概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。 URL 说明 是否允许通信

http://www.a.com/a.js
http://www.a.com/b.js     同一域名下   允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js 同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js     同一域名,不同端口  不允许
http://www.a.com/a.js
https://www.a.com/b.js 同一域名,不同协议 不允许
http://www.a.com/a.js
http://70.32.92.74/b.js 域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js 主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js 不同域名 不允许

对于端口和协议的不同,只能通过后台来解决。 跨域资源共享(CORS): CORS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览器与服务器应该如何沟通。CORS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。 也就是通常是否可以跨域共享,必须由服务器端决定 服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。 如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。 如果浏览器支持,浏览器内部会处理。则前端不需要设置。 通过jsonp跨域: 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。 例如:

<script type="text/javascript"> function dosomething(jsondata){ //处理获得的json数据 } </script>

<script src="http://example.com/data.php?callback=dosomething"></script>

js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。所以jsonp是需要服务器端的页面进行相应的配合的。

HTTP响应头 本节列出了由“跨原始资源共享”规范定义的服务器为访问控制请求发回的HTTP响应头。上一节概述了这些行动。 访问控制允许来源 返回的资源可能有一个Access-Control-Allow-Origin标题,具有以下语法: Access-Control-Allow-Origin: <origin> | * 该origin参数指定可访问资源的URI。浏览器必须执行此操作。对于没有凭据的请求,服务器可以将“”指定为通配符,从而允许任何来源访问资源。 例如,要允许http://mozilla.org访问资源,您可以指定: Access-Control-Allow-Origin: http://mozilla.org 如果服务器指定一个原始主机而不是“”,那么还可以在Vary响应头中包含Origin,以便向客户端指示服务器响应将根据Origin请求头的值而有所不同。 访问控制允许的凭据 的Access-Control-Allow-Credentials报头指示是否对所述请求的响应可以在被暴露credentials标记为真。当作为对预检要求的响应的一部分使用时,这表示是否可以使用凭据进行实际请求。请注意,简单GET请求不是预先指示的,因此如果对具有凭据的资源进行请求,如果该资源未返回此标头,则响应将被浏览器忽略,而不会返回到Web内容。 Access-Control-Allow-Credentials: true 访问控制允许的方法 该Access-Control-Allow-Methods头指定访问资源时所允许的一种或多种方法。这用于响应预检要求。上面讨论了请求是预先启动的条件。 Access-Control-Allow-Methods: <method>[, <method>]* java 过滤器的设置方法:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    response.setHeader("Access-Control-Allow-Origin",((HttpServletRequest) servletRequest).getHeader("origin"));
    response.setHeader("Access-Control-Allow-Credentials","true");
    response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");
    response.setHeader("Access-Control-Allow-Methods","POST, GET, OPTIONS, PUT, DELETE, HEAD, PATCH, TRACE");
    filterChain.doFilter(servletRequest,servletResponse);
}

转载于:https://my.oschina.net/u/3633215/blog/1499004

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值