共计 1390 个字符,预计需要花费 4 分钟才能阅读完成。
场景:
客户端发出 http 请求, 服务端对客户端的 http 请求进行验证
问题:
问题的表象是 从 Chrome 发出 HTTP 命令后,Chrome console 中报“Origin null is not allowed by Access-Control-Allow-Origin”错误。
产生原因:
这是由于 Browser 的 same origin policy 限制的缘故。简单来说,从 HTML 中发出 XMLHttpRequest 请求时,Browser 会做检查,如果发现 Response 中没有 Access-Control-Allow-Origin Header 或 Access-Control-Allow-Origin Header Header 的值与 HTML 的 orgin 不同时,Browser 会拒接绝该 Response,Javascript 就收不到该 Response。本地 HTML 的 Origin 是 null, 而 Server 端没有发出 Access-Control-Allow-Origin Header Header 给 Browser, 所以会有了“Origin null is not allowed by Access-Control-Allow-Origin”错误。
简单的说, 就是由于客户端和服务端处于两个不同的域, 相互之间是不允许通信的.
不同的域包含:1. 静态文件向服务器请求 2. 客户端和服务端域名不同 3. 客户端和服务端端口不同 等等, 个人理解总结的, 不是很准确.
解决办法:
事实上有一个 W3C 标准,Cross Origin Resource Sharing (CORS) 专门用来解决这个问题的。目前的主流 Browser 也有支持。CORS 在 HTTP Message 加入几个 Header,Browser 和 Server 可以利用这些 Header 来判断对方是否是安全,是否可以通信。
http://enable-cors.org/ 介绍了目前常用的服务器和技术的支持 CORS 的办法. 其中对与 JAVA Web, 里面没提到. 整理下让 Java Web 支持的办法.
Java Web 支持的办法:
使用 CORS Filter 解决.
下载地址:http://software.dzhuvinov.com/cors-filter.html
使用方法:http://software.dzhuvinov.com/cors-filter-installation.html
参考文章
http://www.cnblogs.com/LevinJ/archive/2012/04/09/2439670.html
43 Things:CORS
BuzzNet:CORS
del.icio.us:CORS
Flickr:CORS
IceRocket:CORS
LiveJournal:CORS
Technorati:CORS