2008年1月12日星期六

javascript 跨域访问 没有权限的问题

      公司买的报表工具,为了节省成本,将报表服务单独部署了一个应用,我们的业务系统调用报表应用展现报表,开发还算顺利,现在到了用户试用了,问题来了

     其中有个功能叫报表反查,页面中包含了四个fream,用户在其中三个fream中设置查询条件,当点击查询按钮,调用javascript得到每个fream中的参数,并将参数赋值到第四个fream中的form中的隐藏属性中,然后提交这个form(这时的form是在业务系统中的jsp)调用报表服务器的action,返回报表(此时的是报表应用返回的页面,不再是业务系统中的jsp了)。

     这涉及到了两个应用,再次点击查询按钮,Ie就会报“没有权限”错误。

    在网上搜,一个结论,浏览器不允许javaScript跨域访问,据说为了安全,那咋办,得用啊?!

    搜啊搜,找到一个文章专门讨论这事儿的,作者提出了三种解决方案:

    1、在涉及到跨域访问的页面中加入

<script language="JavaScript">
<!--
document.domain = "mycompany.com"; //指定 document 所属的域
-->
</script>

这样可以蒙混过浏览器,但是这种方法必须满足一个条件,就是两个应用必须属于同一个父域,也就是,比如,abc.def.com父域就该是def.com,如果document.domain = "域名";设置的不是其父域,就会报“参数无效”的错误。

      而问题是我们的报表服务器和业务系统服务器不在一个父域下,这条路是行不通了

     召集了公司几个同事讨论,最后得出两个方案,一是改为弹出窗口,而是写webservice

      考虑到工作量,修改要小,选择了弹出窗口。

2、是IE独有了,就是弹出showmodaldialog,这种方法因为IE升级又行不通了。

3、就是通过服务器处理了。

总结,现在看来,解决这个问题就是1和3两种方案,第一种是在客户端处理,局限就是两个应用必须在同一个父域下,还有就是好像不是所有的浏览器支持设置domain。第二种就是通过服务器处理,这种方法好像势必要刷新整个窗口,像我这种情况,一个页面中有几个fream的情况,像保留用户设置的参数,还么有想到好的解决方法。

还想到一条路就是用ajax,这倒是实现了无刷新,但是我们的报表页面展现是一个自定义的jsp标签,还是要服务器展现,这条路没走下去。

参考文章

1 条评论: