【JS】AJAX跨域

AJAX跨域介绍

  AJAX 跨域访问是用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面

  由于安全方面的原因, 客户端js使用xmlhttprequest只能用来向来源网站发送请求,比如在www.readlog.cn下去请求test.readlog.cn的数据,都是不行的。

  什么是AJAX跨域问题

  • 简单来说,就是前端调用后端服务接口时
  • 如果服务接口不是同一个域,就会产生跨域问题

  AJAX跨域场景

  • 前后端分离、服务化的开发模式
  • 前后端开发独立,前端需要大量调用后端接口的场景
  • 只要后端接口不是同一个域,就会产生跨域问题
  • 跨域问题很普遍,解决跨域问题也很重要

  AJAX跨域原因

  • 浏览器限制:浏览器安全校验限制
  • 跨域(协议、域名、端口任何一个不一样都会认为是跨域)
  • XHR(XMLHttpRequest)请求

  AJAX跨域问题解决思路

  • 浏览器:浏览器取下跨域校验,实际价值不大
  • XHR:不使用XHR,使用JSONP,有很多弊端,无法满足现在的开发要求
  • 跨域:被调用方修改支持跨域调用(指定参数);调用方修改隐藏跨域(基于代理)

  如图:

    

解决跨域问题

  实例

    1、新建一个SpringMVC的Maven工程,参考:【Maven】Eclipse 使用Maven创建SpringMVC Web项目

  1 <project xmlns="http://maven.apache.org/POM/4.0.0"
  2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  4     <modelVersion>4.0.0</modelVersion>
  5     <groupId>com.test</groupId>
  6     <artifactId>test-ajax-cross</artifactId>
  7     <packaging>war</packaging>
  8     <version>0.0.1-SNAPSHOT</version>
  9     <!-- 定义maven变量 -->
 10     <properties>
 11         <!-- spring -->
 12         <spring.version>4.0.0.RELEASE</spring.version>
 13
 14         <!-- log -->
 15         <commons-logging.version>1.1.3</commons-logging.version>
 16
 17         <!-- Servlet -->
 18         <servlet.version>3.0.1</servlet.version>
 19         <jsp-api.version>2.2</jsp-api.version>
 20
 21         <!-- jstl -->
 22         <jstl.version>1.2</jstl.version>
 23         <standard.version>1.1.2</standard.version>
 24
 25         <!-- Tool -->
 26         <!-- jackson json包 -->
 27         <jackson-databind.version>2.9.7</jackson-databind.version>
 28         <jackson-core.version>2.9.7</jackson-core.version>
 29         <jackson-annotations.version>2.9.7</jackson-annotations.version>
 30
 31         <!-- test -->
 32         <junit.version>3.8.1</junit.version>
 33
 34         <!-- jdk -->
 35         <jdk.version>1.8</jdk.version>
 36         <maven.compiler.plugin.version>2.3.2</maven.compiler.plugin.version>
 37     </properties>
 38
 39
 40     <dependencies>
 41
 42         <dependency>
 43             <groupId>org.springframework</groupId>
 44             <artifactId>spring-core</artifactId>
 45             <version>${spring.version}</version>
 46         </dependency>
 47
 48         <dependency>
 49             <groupId>org.springframework</groupId>
 50             <artifactId>spring-beans</artifactId>
 51             <version>${spring.version}</version>
 52         </dependency>
 53
 54         <dependency>
 55             <groupId>org.springframework</groupId>
 56             <artifactId>spring-context</artifactId>
 57             <version>${spring.version}</version>
 58         </dependency>
 59
 60         <dependency>
 61             <groupId>org.springframework</groupId>
 62             <artifactId>spring-jdbc</artifactId>
 63             <version>${spring.version}</version>
 64         </dependency>
 65
 66
 67         <dependency>
 68             <groupId>org.springframework</groupId>
 69             <artifactId>spring-expression</artifactId>
 70             <version>${spring.version}</version>
 71         </dependency>
 72
 73         <dependency>
 74             <groupId>org.springframework</groupId>
 75             <artifactId>spring-web</artifactId>
 76             <version>${spring.version}</version>
 77         </dependency>
 78
 79         <dependency>
 80             <groupId>org.springframework</groupId>
 81             <artifactId>spring-webmvc</artifactId>
 82             <version>${spring.version}</version>
 83         </dependency>
 84
 85         <dependency>
 86             <groupId>org.springframework</groupId>
 87             <artifactId>spring-tx</artifactId>
 88             <version>${spring.version}</version>
 89         </dependency>
 90
 91
 92
 93
 94         <!-- Servlet -->
 95         <dependency>
 96             <groupId>javax.servlet</groupId>
 97             <artifactId>javax.servlet-api</artifactId>
 98             <version>${servlet.version}</version>
 99             <scope>provided</scope>
100         </dependency>
101         <dependency>
102             <groupId>javax.servlet.jsp</groupId>
103             <artifactId>jsp-api</artifactId>
104             <version>${jsp-api.version}</version>
105             <scope>provided</scope>
106         </dependency>
107
108         <!-- jstl -->
109         <dependency>
110             <groupId>javax.servlet</groupId>
111             <artifactId>jstl</artifactId>
112             <version>${jstl.version}</version>
113         </dependency>
114
115         <dependency>
116             <groupId>taglibs</groupId>
117             <artifactId>standard</artifactId>
118             <version>${standard.version}</version>
119         </dependency>
120
121
122         <!-- jackson json包 -->
123         <dependency>
124             <groupId>com.fasterxml.jackson.core</groupId>
125             <artifactId>jackson-databind</artifactId>
126             <version>${jackson-databind.version}</version>
127         </dependency>
128
129         <dependency>
130             <groupId>com.fasterxml.jackson.core</groupId>
131             <artifactId>jackson-core</artifactId>
132             <version>${jackson-core.version}</version>
133         </dependency>
134
135         <dependency>
136             <groupId>com.fasterxml.jackson.core</groupId>
137             <artifactId>jackson-annotations</artifactId>
138             <version>${jackson-annotations.version}</version>
139         </dependency>
140
141         <!-- test -->
142         <dependency>
143             <groupId>junit</groupId>
144             <artifactId>junit</artifactId>
145             <version>${junit.version}</version>
146             <scope>test</scope>
147         </dependency>
148
149     </dependencies>
150
151
152     <build>
153         <plugins>
154             <!-- define the project compile level -->
155             <plugin>
156                 <groupId>org.apache.maven.plugins</groupId>
157                 <artifactId>maven-compiler-plugin</artifactId>
158                 <version>${maven.compiler.plugin.version}</version>
159                 <configuration>
160                     <source>${jdk.version}</source>
161                     <target>${jdk.version}</target>
162                 </configuration>
163             </plugin>
164         </plugins>
165         <finalName>test-ajax-cross</finalName>
166     </build>
167
168 </project>

    

    2、新建一个测试controller,注意返回的是一个json对象,项目中需要加入json依赖

 1 package com.test.ajax.cross.controller;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 import javax.servlet.http.HttpServletRequest;
 7
 8 import org.springframework.stereotype.Controller;
 9 import org.springframework.web.bind.annotation.RequestMapping;
10 import org.springframework.web.bind.annotation.ResponseBody;
11 import org.springframework.web.servlet.ModelAndView;
12
13 @Controller
14 @RequestMapping("/test")
15 public class TestController {
16
17     @RequestMapping(value="/get")
18     @ResponseBody
19     public Map getTest(HttpServletRequest request){
20         Map<String, Object> map = new HashMap();
21         map.put("data", "TestController getTest()");
22         return map;
23     }
24 }

    3、新建一个测试界面webapp/static/test.html

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>Insert title here</title>
 6 <script src="jquery-1.11.3.min.js" type="text/javascript"></script>
 7 </head>
 8 <body>
 9     <h2>测试界面</h2>
10     <a href="#" onclick="get()">发送get请求</a>
11 </body>
12 <script type="text/javascript">
13     function get(){
14         $.getJSON("http://localhost:8080/test-ajax-cross/test/get").then(function(result){
15             console.log(result);
16             $("body").append("<br>" + JSON.stringify(result));
17         });
18     }
19 </script>
20 </html>

    4、将项目发布到Tomcat中,并访问测试界面,http://localhost:8080/test-ajax-cross/static/test.html

      

    5、修改hosts文件(用来映射域名与IP),将a.com映射到127.0.0.1,在使用地址:http://localhost:8080/test-ajax-cross/static/test.html#,访问,可以看到无法完成ajax请求了

      

  解决方案一(禁止浏览器检查)

    禁止浏览器检查,启动浏览器时,添加参数禁止浏览器对ajax做检查

    windows采用以下方式打开谷歌浏览器

"C:\Users\UserName\AppData\Local\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir
//不知道chrome.exe 地址的话
右键chrome图标-->属性-->如下图-->图中 目标 就是文件的位置了,直接复制出来即可

    mac采用以下方式打开谷歌浏览器

//chrome 浏览器
open -a "Google Chrome" --args --disable-web-security  --user-data-dir
//safari 浏览器
open -a ‘/Applications/Safari.app‘ --args --disable-web-security --user-data-dir 

    输入地址:http://localhost:8080/test-ajax-cross/static/test.html#,进行访问,可以看到能正常完成ajax请求了

      

  解决方案二(使用JSONP)

    

  

      

原文地址:https://www.cnblogs.com/h--d/p/11470534.html

时间: 2024-08-24 03:57:38

【JS】AJAX跨域的相关文章

将微博或者qq空间的说说同步至博客园 wcf+js(ajax)跨域请求(1)

前天刚写了篇文章使用Bootstrap为你的博客园自定义轮播图片(今天将图片加载的顺序调整了下,不在访问的时候直接加载,而是页面加载最后在脚本里面动态添加dom元素),虽说技术含量不怎么高,但是大家还算感兴趣.其实对博主来说最关键是博客的积分在涨.所以趁热打铁,再来一篇使用wcf+js ajax跨域请求数据同步空间说说的帖子. 因为是请求qq说说的数据,所以要登陆我的qq,这个很麻烦,总不能让每个访客都登陆的qq,然后把数据取出来吧,而且qq也没有相关的接口提供,登陆的时候还要处理验证码.所以这

js ajax跨域被阻止 CORS 头缺少 &#39;Access-Control-Allow-Origin&#39;(转)

今天ajax请求域名的时候出现 已阻止跨源请求:同源策略禁止读取位于 http://www.zuimeimami.com*****的远程资源.(原因:CORS 头缺少 'Access-Control-Allow-Origin'). 解决办法1: var url='http://localhost:8080/WorkGroupManagment/open/getGroupById" +"?id=1&callback=?'; $.ajax({ url:url, dataType:'

js Ajax跨域调用JSON并赋值全局变量

//跨域调用JSON <script type="text/javascript"> function _callback(obj) { alert(obj); } jQuery(document).ready(function(){ $.ajax({ type : "get", async:true, url: "http://www.xxx.com/api/token/getcode", dataType : "json

JS AJAX 跨域

原因: 浏览器的同源策略,不允许AJAX 访问 其他接口 协议,域名,端口 一个不同 就跨域了  http 端口(80) https(443) 可以跨域的三个标签: 1. img : 打点统计,没有浏览器兼容问题 2. srcipt  可以使用CDN ,JSONP 3. link    使用CDN 跨域注意: 所有跨域请求都必须经过信息提供方允许 服务器端设置 http header response.setHeader('Access-Control-Allow-Origin', 'http:

JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对 http://store.company.com/dir/page.html 同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 1.通过jsonp跨域[解决ajax跨域] 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的

js便签笔记(13)——jsonp事实上非常easy【ajax跨域请求】

前两天被问到ajax跨域怎样解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了很多资料,原来如此.. . 为何一直知道jsonp,但一直迷迷糊糊的不明确呢?--网上那些介绍资料都写的太复杂了! 我是能多简单就多简单,争取让你十分钟看完! 1. 同源策略 ajax之所以须要"跨域".罪魁祸首就是浏览器的同源策略.即,一个页面的ajax仅仅能获取这个页面同样源或者同样域的数据. 怎样叫"同源"或者"同域&quo

js便签笔记(13)——jsonp其实很简单【ajax跨域请求】

前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资料,原来如此... 为何一直知道jsonp,但一直迷迷糊糊的不明白呢?——网上那些介绍资料都写的太复杂了! 我是能多简单就多简单,争取让你十分钟看完! 1. 同源策略 ajax之所以需要“跨域”,罪魁祸首就是浏览器的同源策略.即,一个页面的ajax只能获取这个页面相同源或者相同域的数据. 如何叫“同源”或者“同域”呢?——协议.域名.端口号都必须相同.例如: ht

【JS】AJAX跨域-被调用方与调用方解决方案(二)

解决跨域问题 跨域问题说明,参考[JS]AJAX跨域-JSONP解决方案(一) 实例,使用上一章([JS]AJAX跨域-JSONP解决方案(一))的实例 解决方案三(被调用方支持跨域) 被调用方解决,基于支持跨域的解决思路,基于Http协议关于跨域的相关规定,在响应头里增加指定的字段告诉浏览器,允许调用 跨域请求是直接从浏览器发送到被调用方,被调用方在响应头里增加相关信息,返回到页面,页面能正常获取请求内容. 1.服务端增加一个过滤器(CrossFilter.java),过滤所有请求,在请求响应

NodeJ node.js Jquery Ajax 跨域请求

Jquery + Ajax 跨域请求 说白了就是前台请求ajax数据(JSON)但是请求的数据不在本地的绝对路径下,接口数据 是没有这个安全性的我对外公开的接口数据,只要你找到接口你就可以使用里面的数据 ,但是在浏览器端他做了一套机制就是 不让你随意的访问别人服务器的外来接口,如果是好的数据的化  你可以学习使用,如果是一些恶意数据,对服务器对个人来说都是没有安全性的,目前明白一点就是 阻止跨域请求就是 浏览器的原因,也算是ajax的原因,所以这个前台你是无能为力的. 解决办法: 服务器端进行权