被调用方解决跨域是指在HTTP响应头中增加指定的字段,允许调用方调用

可以在两种地方增加
1.apache/nginx(HTTP服务器)
2.tomcat(应用服务器)

浏览器如何判断跨域?
仔细观察可以发现,跨域请求的请求头中多了一个Origin字段,这个字段的值是当前域的信息。
浏览器发现请求是跨域的时候,会在当前请求的请求头中添加一个当前域的信息的字段,等返回后检查响应头中有没有相应的信息。
如果没有,则报错。

浏览器先执行还是先判断?
简单请求先执行后判断,非简单请求先判断后执行。

何为简单请求?
简单请求就是请求header里:
1.无自定义请求头
2.Content-Type为以下几种:
text/plain
multipart/form-data
application/x-www-form-urlencoded
常见方法为:GET、HEAD、POST

非简单请求:
1.put,delete方法的aja请求
2.发送json格式的ajax请求
3.带自定义头的ajax请求
对于非简单请求,浏览器会在htpp的请求头中添加一条字段:
Access-Control-Request-Headers: Content-Type
即:询问服务器是否允许这个Content-Type这个请求头
此时,为了使得非简单请求通过预检,则需要在响应头中添加以下字段:
Access-Control-Allow-Headers: Content-Type
即支持Content-Type

执行简单请求的跨域代码,发现后台服务器正常返回数据,在chrome的network中也可以找到返回的数据。
所以,简单请求浏览器先执行然后判断。
当非简单请求发生跨域时,浏览器检测到非简单的跨域请求,会自动发出一个OPTION请求,就是所谓的预检命令,当预检通过的时候,才会把真正的请求发出去。
即非简单请求在network中可以看到两次请求,一次OPTION请求,一次真正的请求。
由于非简单命令太过耗费时间(请求两次),所以可以在响应请求头中添加一个字段:
Access-Control-Max-Age: 3600 (单位为秒)
即在一个小时内,该请求可以缓存。
此时,在第一次访问这个方法需要请求两次,而第二次则只需要请求一次,去除了预检命令。
但是,此时去除Access-Control-Max-Age与Access-Control-Allow-Headers,则请求依然会成功,因为该请求已经被缓存。

一:被调用方 - Filter解决方案

Filter解决方案主要是在http响应头上添加如下信息:
Access-Control-Allow-Origin: 域名
只要域名包含请求头中Origin字段的值,则支持当前跨域
如果 Access-Control-Allow-Origin: * ,则支持所有域名访问
该字段必填

如果加上 Access-Control-Allow-Methods: 请求方法,则表示只支持特定的请求方法进行跨域。
如Access-Control-Allow-Methods: GET则表示只支持GET方法进行跨域。
如果Access-Control-Allow-Methods: * 则表示支持所有方法进行跨域,此时,写了和没写一样。
此字段可选,非必填。

二:被调用方 - Nginx解决方案

使用Nginx配置代理服务器,前端请求地址改为Nginx配置代理服务器。
在Nginx中配置Filter解决方案中类似的响应头可以实现。

三:被调用方 - Apache解决方案

类似于Nginx解决方案,只不过使用Apache代替Nginx。

四:被调用方 - Spring框架解决方案

Spring框架中有个名为@CrossOrigin的注解,该注解被用来处理跨域请求。
在使用Spring框架的基础上,在代码中使用@CrossOrigin注解,可以解决跨域问题。
@CrossOrigin既可以加在类中,也可以加在具体的方法中,加在类中代表着这个类所有的方法支持跨域,加在方法中代表着这个方法支持跨域。

AJAX跨域问题解决方法(3)——被调用方解决跨域的更多相关文章

  1. AJAX跨域问题解决方法(2)——JSONP解决跨域

    JSONP是什么?JSON全称为JSON with Padding,是JSON的一种补充的使用方式,不是官方协议. 使用JSONP服务器后台要改动吗?JSONP不同于一般的ajax请求返回json对象 ...

  2. AJAX跨域问题解决方法(4)——调用方解决跨域

    调用方解决跨域的方法只有一种,那就是隐藏跨域. 何为隐藏跨域? 隐藏跨域的核心思路是通过反向代理隐藏跨域以欺骗浏览器 什么是反向代理?反向代理是指通过中间服务器使得访问同一个域名的两个不同url最终会 ...

  3. AJAX跨域问题解决方法(1)——禁止浏览器进行跨域限制

    思路:通过命令行修改浏览器启动参数,使得浏览器不进行跨域检查,从而允许跨域 方法:命令行参数启动浏览器后添加参数--disable-web-security 例:chrome --disable-we ...

  4. Ajax 调用webservice 解决跨域请求和发布到服务器后本地调用成功外网失败的问题

        webservice 代码 /// <summary> /// MESService 的摘要说明 /// </summary> [WebService(Namespac ...

  5. [跨域问题]ssm+vue前后台分离跨域问题解决方法

    跨域未解决时: Access to XMLHttpRequest at 'http://localhost:8080/vue/findall from origin 'http://localhost ...

  6. Nuxt使用axios跨域问题解决方法

    Nuxt 是 Vue 项目服务器端渲染(SSR)解决方案.而在使用时,就会遇到前后端分离情况下的域名或端口不一致导致的跨域问题.本文将介绍如何通过设置代理解决 Nuxt 与 axios 集成的跨域问题 ...

  7. vue-cli中跨域问题解决方法

    webpack提供了配置代理的方法解决跨域 1 在vue-cli项目中打开webpack.dev.cof.js,如下 2 打开conifg目录下的index.js,在 proxyTable中进行配置 ...

  8. web项目中的跨域问题解决方法

    一种是JSONP 一种是 CORS. 在客户端Javascript调用服务端接口的时候,如果需要支持跨域的话,需要服务端支持. JSONP的方式就是服务端对返回的值进行回调函数包装,他的优点是支持众多 ...

  9. canvas关于getImageData跨域问题解决方法

    一.问题:在使用html5的canvas是,当用到getImageData方法获取图片信息时,会碰到跨域无法获取的情况,代码如下: document.getElementById("pic& ...

随机推荐

  1. MySQL 参数- Innodb_File_Per_Table(独立表空间)

    Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.共享表空间以及独立表空间都是针对数据的存储方式而言的. 共享表空间某一个数据库的所有 ...

  2. 如何在 window7 环境编译 zlib 库?

    1.下载最新版本 zlib 库 `下载地址:http://www.zlib.net/ 2.打开vc14项目 解压下载的 zlib.zip 压缩包并打开zlib1211\zlib-1.2.11\cont ...

  3. 《设计模式之禅》--MVC框架

    需求:设计一个MVC框架 (以下可能摘要不全,后期整理) 架构图: * 核心控制器:MVC框架入口,负责接收和反馈HTTP请求 * 过滤器:Servlet容器内的过滤器,实现对数据的过滤处理 * 拦截 ...

  4. Vue.directive 自定义指令的问题

    1.今天复习一下Vue自定义指令的代码,结果出现一个很无语的结果,先贴代码. 2. <div id="example" v-change-by="myColor&q ...

  5. DataTable筛选某列最大值

    dt.Compute("max(列名)",""); Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式, ...

  6. MyBatis框架概述

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设 ...

  7. 深度学习菜鸟的信仰地︱Supervessel超能云服务器、深度学习环境全配置

    并非广告~实在是太良心了,所以费时间给他们点赞一下~ SuperVessel云平台是IBM中国研究院和中国系统与技术中心基于POWER架构和OpenStack技术共同构建的, 支持开发者远程开发的免费 ...

  8. 5.2 TLP的路由

    TLP的路由是指TLP通过Switch或者PCIe桥片时采用哪条路径,最终到达EP或者RC的方法.PCIe总线一共定义了三种路由方法,分别是基于地址(Address)的路由,基于ID的路由和隐式路由( ...

  9. R︱foreach+doParallel并行+联用迭代器优化内存+并行机器学习算法

    要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 接着之前写的并行算法paralle ...

  10. mysql常用基础操作语法(十)~~子查询【命令行模式】

    mysql中虽然有连接查询实现多表连接查询,但是连接查询的性能很差,因此便出现了子查询. 1.理论上,子查询可以出现在查询语句的任何位置,但实际应用中多出现在from后和where后.出现在from后 ...