昨天,和果子讨论跨域名访问的问题,
果子说通过js和ajax不能进行跨域名访问,
但是我记得曾经做过一个小的页面程序,直接通过ajax访问页面并得到返回值,所以就试验了下。
简单说,自己做的某web程序访问非本程序所在域名的页面数据,
比如,需要访问http://www.xxxx.com/aaa.jsp,并向其发送参数,然后得到返回值。
发现,在IE下,直接通过ajax即可,无所谓特定方式。在IE6和IE7 下均可。
但firefox由于其自身的安全设置,是禁止类似访问的。
应该是Firefox得到对象数据包后,进行解析时发现与当前网站的域名设置不同,于是抛出异常,禁止访问。
查找了下相应资料,发现有些js框架推出了一些相应的解决方法,试验了下,有的还是有些问题。
总结了下,页面程序要兼容多种浏览器情况下,大致有以下几种解决方式:
1、判断浏览器型号及版本,如果是Firefox更改其安全设置,然后增加代码屏蔽安全性检查。
具体实现网上有,有兴趣的可以baidu下。
个人觉得这是馊主意:web程序本身就是为了人们省掉安装的麻烦,现在要调安全设置,将人的浏览器安全性降低。
强力不推荐。
2、目标页面数据封装为json格式
jQuery提供了一个方法,getJSON。测试了下,这个方法可以在IE和Firefox都可以得到数据。
但是有个问题,就是目标页面提供的数据必须为json格式,不然无法解析。大致实现如下:
$.getJSON("http://www.xxxx.com/aaa.jsp?callback=?",
{para1:"L",para2:"duoduo"},
function (data){
//this;
}
);
{para1:"L",para2:"duoduo"},
function (data){
//this;
}
);
据说getScript方法也可以,不过没试。
3、最简单方便也最不会出问题的方法,由java程序将目标地址和数据发目标地址。
这样不会有什么安全性问题出现了就,跟浏览器也没什么业务关系了。变浏览器直接发送到目标地址 为 服务器中转发送。
java的网络操作还是很方便很强大的。
大致实现如下:
建立一个连接,URLConnection
URL url=new URL("http://www.xxxx.com/aaa.jsp");
conn = url.openConnection();
调用setDoOutput方法,建立输出连接
conn.setDoOutput(true);
然后调用getOutputStream方法,以便获得数据流。这个属于java特色了,什么输入输出的玩艺它都当作流。
一般会有参数,用PrintWriter。
PrintWriter out=new PrintWriter(conn.getOutputStream());
out.print("para1=L¶2=duoduo");//这行是参数
最后关闭连接就Ok了,out.close()。
往下读取数据就是通过BufferReader来进行服务器返回数据的读取了。具体的不写了,太常用了。
java向服务器发送数据和读取应答,都是作为流来处理,相对比较方便,但别忘记操作这些东西需要关注exception。
最后一条其实是最简单方便的实现,
开始走进死胡同了,一直在想js是否能解决,忘记了java的直接实现。
直到快下班时候才突然想起来。
xx啊xx