跨域访问简单来说就是A网站的JavaScript代码试图访问B网站,包括提交内容和获取内容.由于安全原因,跨域访问是被各大浏览器所默认禁止的.在广域网环境中,由于浏览器的安全限制,网络连接的跨域访问时不被允许的,XmlHttpRequest也不例外。但有时候跨域访问资源是必需的。
我们不能在浏览器端直接使用AJAX来跨域访问资源,但是在服务器端是没有这种跨域安全限制的。所以,我们只需要让服务器端帮我们完成“跨域访问”的工作,然后在浏览器端用AJAX获取服务器端“跨域访问”的结果就可以了。这就是所谓的在服务器端创建一个 XmlHttpRequest代理,通过这个代理来访问其他域名下的资源。
使用XmlHttpRequest访问同一域名下的资源:直接访问:
用服务器端的XmlHttpRequest代理来跨域访问资源:
代码:
页面端:
if(url.indexOf("http://")==0){
url=url.replace("?","&");
url="Proxy?url"+url;
}
服务器端
有Get和Post两种方式:以Post方式为例
public class Proxy extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
response.setContentType("text/html;charset=GB2312");
String url = request.getParameter("url");
StringBuffer param = new StringBuffer();
Enumeration enu = request.getParameterNames();
int total = 0;
while(enu.hasMoreElements()){
String name = (String)enu.nextElement();
if(!name.equals("url")){
if(total == 0){
param.append(name).append("=").append(URLEncoder.encode(request.getParameter(name),"UTF-8"));
} else{
param.append("&").append(name).append("=").append(URLEncoder.encode(request.getParameter(name),"UTF-8"));
}
total++;
}
}
PrintWriter out = response.getWriter();
if(url != null){
URL connect = new URL(url.toString());
URLConnection connection = connect.openConnection();
connection.setDoOutput(true);
OutputStreamWriter paramout = new OutputStreamWriter(connection.getOutputStream());
paramout.write(param.toString());
paramout.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"GB2312"));
String line;
while((line = reader.readLine()) != null){
out.println(line);
}
paramout.close();
reader.close();
}
}
Get与Post区别:
1、Get方式利用URL和远程地址交互
2、Post方式利用URL和URLConnection远程地址交互,还要向远程发送请求参数信息。
总结:页面端判断当前请求的地址是不是一个跨域地址,如果是则把地址做一个重定向,把地址指向服务器端的一个代理的程序把原来请求的地址作为一个参数信息送给代理程序,在服务器端get方式和post方式分开处理,做一个还原。
分享到:
相关推荐
AJAX(XMLHttpRequest)进行跨域请求方法详解
关于跨域,有N种类型,本文只专注于ajax请求跨域(,ajax跨域只是属于浏览器”同源策略”中的一部分,其它的还有Cookie跨域iframe跨域,LocalStorage跨域等这里不做介绍),内容大概如下: 什么是ajax跨域 o原理 o表现...
Ajax深度剖析,XMLHttpRequest对象大揭秘
3. Re:JS面向对象的程序设计 4. Re:查看LINUX进程内存占用情 1. 查看LINUX进程内存占用情况 2. Linux上Oracle 11g安装步
HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已经实现了跨域访问。但ie10以下不支持 只需要在服务端填上响应头: header("Access-Control-Allow-Origin:*"); /*星号表示所有的域都可以接受,*/ header("Access...
XMLHttpRequest Ajax xml http request
Ajax核心对象XMLHTTPRequest详细参数及例子
一、原生JS实现ajax 第一步获得XMLHttpRequest对象 第二步:设置状态监听函数 第三步:open一个连接,true是异步请求 第四部:send一个请求,可以发送一个对象和字符串,不需要传递数据发送null 第五步:在监听函数...
当出现跨域访问的时候ajax通常会报类似如下错误: XMLHttpRequest cannot load http://192.168.2.12:8001/oss/api/version/check. No ‘Access-Control-Allow-Origin’ header is present on the requested resource...
在源网页加载之前,实现一个XMLHttpRequest的代理对象,然后覆盖全局的XMLHttpRequest,这样一但上层调用 new XMLHttpRequest这样的代码时,其实创建的是Ajax-hook的代理对象实例
Ajax 简单实例 XMLHttpRequest对象的创建,请求,发送,仅供初学者
ajax请求报parsererror错误是很宽泛的概念,很多情况下都报这个错, 在很多时候,即使ajax提交、返回都正常 XMLHttpRequest.status=200 (正常响应) XMLHttpRequest.readyState=4 (正常接收) ajax也会提示一个parse...
VS2008 AJAX控件介绍 AJAX组成及XMLHttpRequest对象的讲解
详解Ajax的核心对象XmlHttpRequest
经测试,用此方法创建XMLHttpRequest对象,在运用AJAX的时候,可以的兼容IE6,IE7,IE8,Opera,Safari,Google Chrome,fireFox。主流的应该就这些吧?theWorld,遨游等浏览器都是以IE为核心的,所以肯定也没问题。 另外...
1 var xhr = new XMLHttpRequest(); 2 xhr.open(“POST”, “http://xxxx.com/demo/b/index.php”, true); 3 xhr.withCredentials = true; //支持跨域发送cookies 4 xhr.send(); 2、jquery的ajax的post方法请求...
比如我们用Ajax访问城市天气预报、IP地址等公共服务接口时,就涉及跨域了。我们请求一个外部服务时,浏览器会基于安全问题拒绝授权访问。 而script、script、iframe标签的src属性就不存在跨域的问题,所以Ajax跨域...
由于浏览器实现的同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,所以AJAX是不允许跨域的。这里提供自己常用的三种方法: 1、jsonp访问 JSONP(JSON with Padding)是一个非官方的...
ajax-proxy是一个用ES6中代理特性实现的用于代理原生对象XMLHttpRequest的库,它可以使您从对XMLHttpRequest进行操作。 使用 安装 CDN约会 < script > ...
ajax工具,XMLHttpRequest调试工具