关于JavaScript 访问基于SOAP的WebService跨域问题

关于JavaScript 访问基于SOAP的WebService跨域问题

最近,搭建好了一个基于SOAP的WebService服务器。结果,使用JavaScript访问WebService遇到了跨域的问题!

首先,声明代码中的WebService不是本人搭建,由于本人的服务器地址不方便公开。

这个是测试HTML

<html>
    <meta charset="utf-8" />
    <head>
        <title>通过ajax调用WebService服务</title>
        <script>

            var xhr = new XMLHttpRequest();
            function sendMsg(){
                var name = document.getElementById(‘name‘).value;
                //服务的地址
                var wsUrl = ‘http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx‘;

                //请求体
                var soap = ‘<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://ws.itcast.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">‘ +
                                     ‘ <soapenv:Body><getRegionCountry xmlns="http://WebXml.com.cn/" /></soapenv:Body> </soapenv:Envelope>‘;

                //打开连接
                xhr.open(‘POST‘,wsUrl,true);

                //重新设置请求头
                xhr.setRequestHeader("Content-Type","text/xml;charset=UTF-8");

                xhr.setRequestHeader("SOAPAction","http://WebXml.com.cn/getRegionCountry");

                //设置回调函数
                xhr.onreadystatechange = _back;

                //发送请求
                xhr.send(soap);
            }

            function _back(){
                if(xhr.readyState == 4){
                    if(xhr.status == 200){
                            //alert(‘调用Webservice成功了‘);
                            var ret = xhr.responseXML;
                            var msg = ret.getElementsByTagName(‘return‘)[0];
                            document.getElementById(‘showInfo‘).innerHTML = msg.text;
                            //alert(msg.text);
                        }
                }
            }
        </script>
    </head>
    <body>
            <input type="button" value="发送SOAP请求" onclick="sendMsg();">
            <input type="text" id="name">
            <div id="showInfo">
            </div>
    </body>
</html>

浏览器按下F12以后:

出现

OPTIONS http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx 403 (Forbidden)
OPTIONS http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx No ‘Access-Control-Allow-Origin‘ header is present on the requested resource. Origin ‘http://127.0.0.1:8020‘ is therefore not allowed access.
XMLHttpRequest cannot load http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx. No ‘Access-Control-Allow-Origin‘ header is present on the requested resource. Origin ‘http://127.0.0.1:8020‘ is therefore not allowed access. 

目前,看网上都是通过JSONP,即src服务器端JS,然后通过回调函数传递数据。

但是,这个得有个前提:服务器端得配合你啊,假如,你与服务器端不是一伙人,那么协调是个问题啊!

另外,对于服务器端来讲,这种做法也不安全哇!

对于JavaScript 的同源策略,确实很好的提高了安全性!但是,也限制了移动端开发纯HTML5+JS的APP!

目前,我已经放弃使用JavaScript 访问 WebService了,我使用纯HTML5开发移动APP的做法,也值得商榷!

保险的做法是,HTML5+JS做界面,原生语言做后端!

那么,我看不出HTML5+JS 比 Android的XML, WP的XLAM好了很多。。。

此外,我对于Qt的跨平台,表示出极大的看好!

希望,能有个大神指点我一下JavaScript 跨域问题,既保证客服端的便捷,也保证服务器端的安全!

2014-12-19

时间: 2024-08-26 20:23:10

关于JavaScript 访问基于SOAP的WebService跨域问题的相关文章

python发布及调用基于SOAP的webservice

现如今面向服务(SOA)的架构设计已经成为主流,把公用的服务打包成一个个webservice供各方调用是一种非常常用的做法,而应用最广泛的则是基于SOAP协议和wsdl的webservice.本文讲解python环境下如何发布及调用一个基于SOAP的webservice,基于soaplib(发布)和suds(调用). OS:ubuntu 14.04  python:2.7.6 服务端: 1.安装: 服务端要使用的工具包是soaplib,遗憾的是现在也停止维护了,不过好在还能用,下载地址在http

基于CORS的GeoServer跨域访问策略

GeoServer的跨域访问问题,有多种解决方法,本文介绍一种基于CORS的GeoServer跨域访问方法. CORS简介 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制.通常由于同域

JS-JQuery(JSONP)调用WebService跨域若干技术点

1.JSONP:JSON With Padding,让网页从别的网域获取信息,也就是跨域获取信息,可以当做是一种"工具",大多数架构Jquery.EXTjs等都支持. 由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就

.net 访问 geoserver 发布的 wms &nbsp; 跨域问题解决方案

环境:  服务器  geoserver2.4.1 开发机访问服务器发布的wms 存在跨域问题,研究两天终于找到解决方案. 主要思路是: 使用jquery的ajax 代替Groserver的request, 然后将wms的请求地址转发到.net的处理程序, 使用.net的处理程序进行跨域处理.  function mouseClick(e) {             var layer = new Array();             layer = map.getLayersByName(

(转)基于SOAP的WebService的调用原理

SOAP的概念应该不是什么新鲜事物了.简单的说,SOAP是以把数据以XML的方式组合起来,然后通过HTTP协议(也可以是其 它协议,但是通常总是用http协议)和远程服务进行通信的一个标准,也可以把它认为是一个中间件,起着沟通桥梁的作用.因为当所有的服务都使用同一种标 准,那么沟通就比较容易了. 当然不得不承认,SOAP格式的报文内容冗余,并且依赖于定义好的XML schemas,对于手工创建SOAP报文十分复杂,需要借助一些工具来简化工作.因此越来越多的Web服务倾向于使用Restful风格的

XMLHttpRequest 请求java部署的webservice 跨域问题

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <title>企业列表</title> </head> <body > </body> </html> <script type="text/javascript"> var webservic

Ajax请求WebService跨域问题

1.背景 用Jquery中Ajax方式在asp.net开发环境中WebService接口的调用 2.出现的问题 原因分析:浏览器同源策略的影响(即JavaScript或Cookie只能访问同域下的内容); 3.解决方案: (1) JSONP:只支持GET方式 (2) CROS:跨域资源共享 以下为CROS解决方案: a.在WebService接口加上响应头信息: b.在web.config文件中加上相关配置节信息: 运用a或者b的解决方案后,浏览器头信息中变动如下: 最终问题得以较好的解决,但对

WebService跨域配置、Ajax跨域请求、附开发过程源码

项目开发过程中需要和其他公司的数据对接,当时我们公司提供的是WebService,本地测试,都是好的,Ajax跨域请求,就报错,配置WebService过程中,花了不少功夫,入不少坑,不过最终问题还是解决啦~~~特意将完整开发步骤记录下来,以备下次勿犯,废话不多说,直接上源码! 第一步,右键,新建项,添加"web服务" 第二步:在webservice项目的web.config中添加如下配置,缺一不可: 1 <system.web> 2 <webServices>

访问本地json文件因跨域导致的问题

我使用jquery的getJSON的方法获取本地的json文件,并进行操作,获取json 数据代码如下: $.getJSON("invite_panel.json",function(data){//获取json文件中的数据 $.each(data, function (index, obj) //对json数据进行遍历 } 因我获取的是本地的 json 文件数据,因此导致了跨域问题,使得大部分主流浏览器报错,并无法获取本地的 json 文件,使用chrome浏览器查看错误如下: 通过