1.什么是跨域资源请求?

https://www.cnblogs.com/niuli1987/p/10252214.html

同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。

1.1 同源策略 :  浏览器的一个安全功能,不同源的客户端js脚本在没有明确授权的情况下,不能读写对方资源。用于隔离潜在恶意文件的重要安全机制。

  同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。

  使用js脚本读写非同源的资源会被拒绝的(跨域资源的引入是可以的,使用js读写则受限制),因此 XMLHttpRequest 受同源策略限制。

1.2 不受同源策略限制的(跨域资源的引入是允许的)

  页面中的链接,重定向以及表单提交是不会受到同源策略限制的。

  如嵌入到页面中的<script src="..."></script>,<img>,<link>,<iframe>等。

  ps:  跨域限制都是对浏览器端来说的,服务器端是不存在跨域安全限制。

2.如何解决 跨域资源请求 限制

         https://www.cnblogs.com/niuli1987/p/10252214.html

2.1 JSONP (不推荐)

例子:跨域资源位于  http://localhost:8066/file/jsonp

springboot 工程

    @RequestMapping(value="/jsonp", method=RequestMethod.GET )
public String jsonp(@RequestParam("callback") String callback, HttpServletRequest request) { // 处理正确的jsonp请求, 返回: callback方法名(json字符串)
if(callback != null && !callback.equals("")) {
return callback + "(" + "{\"key\": \"hello\"}" + ")";
} //不是jsonp请求
return "hello";
}
2.1.1  使用ajax出现 跨域请求限制

XMLHttpRequest发起了请求,但是响应中获取不到值

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax 跨域请求(不能成功)</title>
</head>
<body>
<div id="mydiv">
<button id="btn">点击</button>
</div>
</body>
<script type="text/javascript">
window.onload = function() { var oBtn = document.getElementById('btn'); oBtn.onclick = function() { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理响应
alert( xhr.responseText );
}
};
// 跨域请求
xhr.open('get', 'http://localhost:8066/file/jsonp?callback', true);
xhr.send();
};
};
</script>
</html>

2.1.2 使用JSONP 避免跨域请求限制

原理:利用 <script src="..."></script> 中src 引入跨域资源(不受同源策略限制),浏览器收到响应后,通知回调函数处理该跨域资源。

缺点:只能通过是get请求引入跨域资源。

在页面插入带有src 属性的 <script>标签,src 地址即跨域资源地址;

服务端对于 JSONP请求的 响应格式是: callback函数名(JSON字符串) 。 (非标准协议)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP实现跨域(只支持get请求)</title>
</head>
<body>
<div id="mydiv">
<button id="btn">点击</button>
</div>
</body> <script type="text/javascript">
// 回调函数,处理响应
function handleResponse(response){
console.log(response);
alert(JSON.stringify(response)); //将json对象转为 字符串 }
</script> <script type="text/javascript">
window.onload = function() {
var oBtn = document.getElementById('btn'); oBtn.onclick = function() {
// 创建一个script标签
var script = document.createElement("script"); //设置script标签的src
script.src = "http://localhost:8066/file/jsonp?callback=handleResponse"; //在页面插入一个script标签,将会发起src请求
document.body.insertBefore(script, document.body.firstChild);
};
};
</script> </html>

#####

2.2 CORS (推荐)

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

  CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

   实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信(包括客户端跨域读取cookie,跨域访问服务端资源)。

例如1: https://api.github.com/  支持跨域资源请求

响应头中含有   Access-Control-Allow-Origin ;      它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

例2 :服务端配置响应头,客户端可跨域访问cookie

    resp.setHeader("Access-Control-Allow-Origin", origin);            // 允许指定域访问跨域资源
resp.setHeader("Access-Control-Allow-Credentials", "true"); // 允许客户端携带跨域cookie,此时origin值不能为“*”,只能为指定单一域名
2.2.1 springboot 后台服务 配置 支持  CORS

配置 WebMvcConfigurerAdapter, 可提支持 站外Ajax请求访问的跨域资源

1)配置后台服务

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration
public class CORSConfiguration extends WebMvcConfigurerAdapter { @Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("*")
.allowedOrigins("*")
.allowedHeaders("*");
}
}

addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。

allowedMethods:允许所有的请求方法访问该跨域资源服务器,如:POST、GET、PUT、DELETE等。
allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:"http://www.baidu.com",只有百度可以访问我们的跨域资源。
allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:"X-YAUTH-TOKEN"
 
2)可以直接使用 XMLHttpRequest 访问跨域资源
 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax 跨域请求</title>
</head>
<body>
<div id="mydiv">
<button id="btn">点击</button>
</div>
</body>
<script type="text/javascript">
window.onload = function() { var oBtn = document.getElementById('btn'); oBtn.onclick = function() { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理响应
alert( xhr.responseText );
}
};
// 跨域请求
xhr.open('get', 'http://localhost:8066/file/jsonp?callback', true);
xhr.send();
};
};
</script>
</html>

 
 
 

2.3 利用nginx 反向代理解决跨域问题

 

location /apis {
  rewrite ^.+apis/?(.*)$ /$1 break;
  include uwsgi_params;
  proxy_pass http://www.baidu.com/;
}

对于浏览器来说,访问的就是同源服务器上的一个url。而nginx通过检测url前缀,把http请求转发到后面真实的物理服务器。并通过rewrite命令把前缀再去掉。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。

 
 
 
 

3. 跨域请求伪造 CSRF 防御

 
 

  CORS - Cross Origin Resourse-Sharing - 跨站资源共享

  CSRF - Cross-Site Request Forgery - 跨站请求伪造

3.1 如何防止 CSRF 攻击

https://www.bilibili.com/video/av33502871/?spm_id_from=333.788.videocard.0

CSRF 攻击:

  当用户不小心在本机访问 fuck.com 黑客页面的时候,黑客页面上放了一个按钮或者一个表单(URL/action 为 http://you.com/delete-myself,当前用户登录过的网站),当用户触发这个按钮或表单的,浏览器发出 GET 或 POST 请求的时候,会带上 you.com 的 cookie;如果you.com网站没有做 CSRF 防御措施,那么这次请求在 you.com 看来会是完全合法的,但是实际上是黑客伪造的请求。

CSRF 防御:

  CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求。(该请求中所有的用户验证信息都存在于Cookie中,攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。)

  CSRF 主流防御方式是,用户每次发起请求之前,先从后端获取随机 token(后端同时将此 token 保存到缓存如redis中);

  用户发起请求时携带该token,如果后端检查到没有 token或者提交的token和后端缓存的不一致,则请求失败;当token校验通过后,此toiken在缓存中被删除以防止token被冒用。

*** 如何确保获取token的请求不是伪造的??

004. 前端跨域资源请求: JSONP/CORS/反向代理的更多相关文章

  1. JSONP、图片Ping、XMLHttpRequest2.0等跨域资源请求(CORS)

    跨域:当协议.主域名.子域名.端口号中任意一个不相同时都不算同一个域,而在不同域之间请求数据即为跨域请求.解决方法有以下几种(如有错误欢迎指出)以请求图片url为例: 1.通过XMLHttpReque ...

  2. JavaScript跨域资源请求(CORS)解决方案

    跨域:当协议.主域名.子域名.端口号中任意一个不相同时都不算同一个域,而在不同域之间请求数据即为跨域请求.解决方法有以下几种(如有错误欢迎指出)以请求图片url为例: 1.通过XMLHttpReque ...

  3. 跨域问题,解决方案-Nginx反向代理

    跨域问题,解决之道 跨域问题,在日常开发过程中,是一个非常熟悉的名词.今天的话题,结合我之前的项目场景,讨论下<跨域问题,解决之道>. 跨域是什么 跨域问题,是由于JavaScript出于 ...

  4. [跨域]跨域解决方法之Ngnix反向代理

    跨域原理:http://www.cnblogs.com/Alear/p/8758331.html 介绍Ngnix之前,我么先来介绍下代理是什么~ 代理相当于中间人,中介的概念 代理分为正向代理和反向代 ...

  5. 跨域资源请求(除jsonp以外)的方法

    ---------------------------------------------------------------------------------------------------- ...

  6. 前端跨域调请求 nginx反向代理

    用 本地pc的目录,请求192.168.3.246的接口,以/api为标识 运行命令: 启动 nginx -s start 重启 nginx -s relaod 停止 nginx -s stop 查看 ...

  7. .net MVC下跨域Ajax请求(JSONP)

    一.JSONP(JSON with Padding) 客户端: <script type="text/javascript"> function TestJsonp() ...

  8. JavaScript跨域调用、JSONP、CORS与ASP.NET Web API[共8篇]

    [第1篇] 同源策略与JSONP 浏览器是访问Internet的工具,也是客户端应用的宿主,它为客户端应用提供一个寄宿和运行的环境.而这里所说的应用,基本是指在浏览器中执行的客户端JavaScript ...

  9. jsonp实现跨域资源访问

    平时项目中处理ajax跨域资源请求时,例如www.example2.com上的某个页面要请求www.example1.com的数据,我们使用得较多的是jsonp方式.jsonp通过JavaScript ...

随机推荐

  1. Python学习 Part3:数据结构

    Python学习 Part3:数据结构 1. 深入列表: 所有的列表对象方法 list.append(x): 在列表的末尾添加一个元素 list.extend(L): 在列表的末尾添加一个指定列表的所 ...

  2. python_函数设计

    >>> def check_permission(func): def wrapper(*args,**kwargs): if kwargs.get('username')!='ad ...

  3. Win32项目生成的程序exe图标显示异常的问题

    问题 如图: 用VS2013生成exe执行文件时发现的问题,起初以为是没添加ico图像的最小尺寸,后来查看ico并不是这个问题. Baidu.Google了半天找到原因:文件资源管理器的图标缓存bug ...

  4. AXIS2整合spring需要的jar,以及大部分缺少jar所报的异常

    axis2 webservice 服务端jar包: -->axis2-kernel-1.6.1.jar                              -->axis2-spri ...

  5. jndi通俗理解以及它的指令缺陷

    jndi(java naming directory interface),可以把JNDI看成一个全局的目录服务接口,实现了这个接口的类可以提供你想要的东西,不管这个东西是什么,只要注册到了目录中就可 ...

  6. this.state.menuList.toArray()[0].get('id')

    用toArray()处理传过来的list用get(")获取里面的值 而我用的是attributes得方法

  7. Python random() 函数

    描述 random() 方法返回随机生成的一个实数,它在[0,1)范围内. 语法 以下是 random() 方法的语法: import random random.random() 注意:random ...

  8. yum安装指定版本的软件包的方法

    yum默认都是安装最新版的软件,这样可能会出一些问题,或者我们希望yum安装指定(特定)版本(旧版本)软件包.所以,就顺带分享yum安装指定(特定)版本(旧版本)软件包的方法. 过程如下:假设这里是我 ...

  9. 图片和base64相互转化

    # -*- coding: utf-8 -*- import urllib2 as ulb import base64 #用urllib2库链接网络图像 response=ulb.Request('h ...

  10. api_response.go

    , "METHOD_NOT_ALLOWED"}         }, Log(l), V1)(w, req, nil)     }) }