跨域和cookie

news2024/11/16 20:13:22

本文以前端的视角来探讨浏览器的跨域和cookie问题。

一、跨域

跨域简介:

为什么会出现跨域?

  • 出于浏览器的同源策略限制,浏览器会拒绝跨域请求。

什么情况下出现跨域?

  • 不同源就会跨域。同源即:协议、域名、端口号都相同。任意一项不同就会跨域。
  • 例如 https://127.0.0.1:8000

为什么会有跨域需求?

  • 项目工程服务化后,不同职责的服务分散在不同的工程中,往往这些工程的域名是不同的,但一个需求可能需要对应到多个服务,这时便需要调用不同服务的接口,因此会出现跨域。

跨域只是浏览器的限制,服务器没有跨域问题。

跨域的解决方式:

跨域的解决最常见的三种方式:jsonp、CORS、反向代理

1、jsonp

实现原理:

  • 通过script标签的src属性可以访问跨域的资源,在这方面浏览器没有做限制。
    简略步骤:
  • 前端注册一个方法,通过script的src属性指向后端接口,并将该方法传参给后端
  • 后端将该方法名和处理后的数据以方法调用的方式拼接起来
  • 前端接受到响应后自动调用方法,在方法体内接收数据做处理。

示例代码:

  • js
<script type="text/javascript">
    function dosomething(data){
        //处理获得的数据
    }
</script>
<script src="http://example.com/data.php?callback=dosomething"></script>
  • php
$callback = $_GET['callback'];//得到回调函数名
$data = array('a','b','c');//要返回的数据
echo $callback.'('.json_encode($data).')';//输出

缺点:

  • 只支持get请求
  • 异常处理不方便

jsonp是jquery时代常用的跨域解决方式,现在几乎不用了。

2、CORS

  • CORS 即 跨域资源共享,CORS方式也叫白名单方式,是W3C 推荐的一种新的官方方案,能使服务器支持 ajax 的跨域请求。CORS 实现起来非常方便,只需要增加一些 HTTP 头,让服务器能声明允许的访问来源。
    实现方式:
  • 通过在服务端配置响应头 Access-Control-Allow-Origin 实现,值为允许跨域访问的域名白名单。

3、反向代理

  • 通过在服务器配置请求代理来实现跨域,因为跨域是浏览器端的限制,而在服务器端没有这一限制。
    实现方式:
  • 前端请求使用的接口地址和浏览器页面地址同源,避免跨域
  • 服务端拦截接口请求,转发到真实的接口地址,拿到响应数据后再返回给前端。

代码示例:

server {
	# 监听端口80 即当访问服务器的端口是80时,进入这个server块处理
	listen 80;
	# location后面代表访问路径 当是/ 请求时 代理到实际的地址
    location / {
		# 使用 proxy_pass(固定写法)后面跟要代理服务器地址            
        proxy_pass http://xxx.xxx.xxx.xxx:8080;
    }
}    

二、cookie

客户端请求服务器时,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。
而客户端浏览器会把Cookie保存起来。
当浏览器再请求服务器时,浏览器把请求的网址连同该Cookie一同提交给服务器。
服务器通过检查该Cookie来获取用户状态。

cookie属性:

  • name cookie的名字,Cookie一旦创建,名称便不可更改
  • value cookie值
  • comment 该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
  • domain 可以访问该Cookie的域名。如果设置为“.alipay.com”,则所有以“baidu.com”结尾的子域名都可以访问该Cookie;第一个字符必须为“.”
  • maxAge Cookie失效的时间,单位秒。
    • 正数,则超过maxAge秒之后失效。
    • 负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。
    • 为0,表示删除该Cookie。
  • path 该Cookie的使用路径。例如:path设置时,其以“/”结尾.
    • path=/,说明本域名下contextPath都可以访问该Cookie。
    • path=/app/,则只有路径为“/app”的程序可以访问该Cookie
  • secure 该Cookie是否仅被使用安全协议传输。这里的安全协议包括HTTPS,SSL等。默认为false。
  • version 该Cookie使用的版本号。在servlet规范中默认是0;
    • 0 表示遵循Netscape的Cookie规范,目前大多数用的都是这种规范;
    • 1 表示遵循W3C的RFC2109规范;规范过于严格,实施起来很难。
  • isHttpOnly HttpOnly属性是用来限制非HTTP协议程序接口对客户端Cookie进行访问;也就是说如果想要在客户端取到httponly的Cookie的唯一方法就是使用AJAX,将取Cookie的操作放到服务端,接收客户端发送的ajax请求后将取值结果通过HTTP返回客户端。
  • sameSite 是为了防止csrf攻击而产生的属性
    上述的这些属性,除了name与value属性会被提交外,其他的属性对于客户端来说都是不可读的,也是不可被提交的。

内网统一登录:

实现方式:

  • 用户在内网登录后,后端在登录接口的响应头里配置set-cookie,将cookie字段写入浏览器里
  • 一般会将cookie的domain设置为二级域名,有多个二级域名就设多个cookie,子域名页面里的请求能携带父级域名的cookie
  • 后端获取前端请求里的cookie字段判断用户是否登录

三、跨域携带cookie

有些场景是需要跨域ajax请求时也要携带cookie,默认情况下是不会携带的。

满足条件:

很多人知道需要在 ajax 里配置 withCredentials 为 true,但光有这个不够,需要满足的条件如下:

  • withCredentials
    • ajax里配置 withCredentials 为 true
  • 响应头
    • 服务端需配置响应头字段:Access-Control-Allow-Origin,值为允许跨域的域名,不能为星号*
    • 还需要服务端配置另一响应头字段:Access-Control-Allow-Credentials,值为true
  • 跨站
    • 请求是否跨站,在非同一父域名下的就是跨站,跨站的情况需要cookie的属性满足以下条件:
      • cookie字段的 samesite 需要设置 none
      • 将samesite设为none时,有一个要求,就是cookie的 secure 属性需要设置为 true
      • 当secure设为true时,只允许https请求携带cookie,所以请求地址需要是 https 协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图文详解:箭头函数与常规函数的this指向问题

函数中this的指向问题特别容易让人迷糊&#xff0c;这里用示例来指点迷津&#xff0c;走出迷茫。 常规函数下的this指向 1. 纯粹的函数调用 function test(name) { console.log(name) console.log(this) } test(zjcopy) ; test.call(zjcopy, cuclife-2) ; test.call(fal…

pytesseract 安装错误总结

项目场景&#xff1a; 使用eclipse调用pytesseract接口&#xff0c;进行OCR识别。 在anaconda的python3.6.4版本&#xff0c;安装配置pytesseract 问题描述 pip install pytesseract 报错 错误提醒&#xff1a;pytesseract requires Python >3.7 but the running Python…

【数据结构】顺序栈的原理及实现

【数据结构】顺序栈的原理及实现 1.什么是栈 栈它是一种先进后出的有序列表数据结构。栈是线性表里的元素插入和删除只能在该线性表的同一端进行的一种特殊线性表。该线性表的插入和删除都叫栈顶&#xff0c;也就是变化的一端。另一端是固定不变的成为栈底。根据下图可以看出…

《高性能MySQL》——架构与历史(笔记)

文章目录一、MySQL架构与历史1.1.1 连接管理与安全性1.1.2 优化与执行1.2 并发控制1.2.1 读写锁1.2.2 锁粒度&#xff08;锁模式&#xff09;表锁(table lock)行级锁(row lock)1.3 事务1.3.1 隔离级别READ UNCOMITTED (读未提交)READ COMMITTED (读提交)REPEATABLE READ (可重复…

初识C++(学习计划)

前言 基于对C语言的学习&#xff0c;我将进一步学习C的相关知识。 我们在使用C语言时创建的是.c文件&#xff0c;使用C使用的是.cpp文件&#xff0c;其中p——plus&#xff08;加&#xff0c;的意思&#xff09;&#xff0c;所以cpp就是c。 C是为了解决一些C语言不能解决的问题…

SpringBatch使用(一)

一、SpringBatch简介 1、Spring Batch是一个轻量级&#xff0c;全面的批处理框架&#xff0c;旨在开发对企业系统日常运营至关重要的强大批处理应用程序。Spring Batch构建了人们期望的Spring Framework特性&#xff08;生产力&#xff0c;基于POJO的开发方法和一般易用性&…

docker安装elasticsearch kibana 8.6.0(设置密码+汉化+ik分词器)

安装eskibana安装:拉取镜像并安装设置密码汉化配置ik分词器安装: 记得开放使用的端口,或者关闭防火墙 提示:需要提升虚拟机或者服务器的内存到8G以上 拉取镜像并安装 docker pull elasticsearch:8.6.0 docker pull kibana:8.6.0docker network create es-netdocker run -it…

Itext7在PDF指定位置添加电子公章

目录 1. 电子公章的制作 2. java工具keytool生成p12数字证书文件 3. pom依赖 4. 实体类 5. 工具类及测试示例 6. 效果 1. 电子公章的制作 做章网站&#xff1a;http://seal.biaozhiku.com/ 我们选择圆形印章 然后输入公司名&#xff0c;输入章名输入编码然后点击395生成&…

快速幂及矩阵快速幂分析及代码实现

文章目录前言一、认识快速幂二、快速幂思路及代码三、矩阵快速幂3.1、矩阵乘法代码实现3.2、矩阵快速幂代码实现参考资料前言 在学习Acwing c蓝桥杯辅导课第九讲复杂DP-AcWing 1303. 斐波那契前 n 项和时有使用到矩阵快速幂算法&#xff0c;这里来记录下知识点正好也将快速幂部…

车载以太网 - SomeIP测试专栏 - 详细解析 - 01

对于介绍SomeIP协议&#xff0c;我还是想从最基础的协议解析来&#xff0c;所以今天还是先将SomeIP协议详解给大家列举一下&#xff0c;也方便大家在工作中如果不记得哪些信息随时可以查看学习&#xff0c;也算是留给我自己的笔记吧&#xff0c;毕竟确实容易忘记。 SomeIP数据&…

分布式数据库中间件——Mycat2

一、Mycat2 概述 Mycat是基于java语言编写的数据库中间件&#xff0c;核心功能是分库分表和读写分离&#xff0c;可以将大表水平分割为N个小表。 可以看做为Mysql的数据库服务器&#xff0c;可以用连接Mysql的方式去连接Mycat&#xff0c;端口为8066 二、Mycat的三大作用 2.…

Node 项目中常见的问题及解决方法

1. window和mac下设置NODE_ENV变量的问题 我们都知道在前端项目中会根据不同的环境变量来处理不同的逻辑&#xff0c;在node后端中也一样&#xff0c;我们需要设置本地开发环境、测试环境、 线上环境等&#xff0c;此时有一直设置环境变量的方案是在package.json中的script属性…

Python学习笔记——错误和异常

错误的分类编写程序过程中遇到的错误都分为两类&#xff1a;语法错误与运行时错误。语法错误&#xff1a;当代码不符合Python语法规则时, 在解析过程中会报SyntaxError。运行时错误&#xff1a;即语句或表达式在语法上都是正确的, 但在运行时发生了错误。当程序发生异常时&…

从零搭建完整python自动化测试框架(UI自动化和接口自动化

从零搭建完整python自动化测试框架&#xff08;UI自动化和接口自动化&#xff09; 文章目录 总体框架 PO模式、DDT数据驱动、关键字驱动 框架技术选择 框架运行结果 各用例对应的定义方式&#xff08;PO/DDT&#xff09; 测试执行结果 从零开始搭建项目 一、开发环境搭…

Vue-Vuex

前言 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库 官网介绍&#xff1a;https://vuex.vuejs.org/zh/ 以下主要讲解的是如何定义与使用&#xff0c;如果还没有对vuex进行了解的话&#xff0c;请先查看官网&#xff0c;了解其功能、用法及用途。 关于vuex&#xff0c…

代码随想录算法训练营第五十二天_第九章_动态规划 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

LeetCdoe 121. 买卖股票的最佳时机给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可…

verilog 数字系统设计读书笔记-------持久更新

Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们所对应的模型类型共有以下5种&#xff1a;系统级、算法级、RTL级、门级、开关级‘bz :表示高阻态&#xff0c; ’bx表示不定值&#xff08;0或1均可&#xff09;include "muxtwo.v" 将文件引进{$ ra…

【Linux】怎么理解进程

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Liunx系统编程 本文通过冯诺依曼体系结构&#xff08;硬件部分&#xff09;和操作系统&#xff08;软件部分&#xff09;为基础来介绍我们应该如何理解进程&#xff0c;为后续的学习做铺垫。 本文目录一、预备知识1.建…

误差逆传播算法公式理解及推导

前言&#xff1a;公式理解及推导参考自《机器学习》周志华 P101 BP网络 BP网络一般是指由 误差逆传播&#xff08;error BackPropagation, BP&#xff09;算法训练的多层前馈神经网络。 给定训练集 D{(x1,y1)D\left\{\left(\boldsymbol{x}_1, \boldsymbol{y}_1\right)\right…

2023年我的Flag已准备完毕

前言&#xff1a; &#x1f604;作者简介&#xff1a;小曾同学.com,小伙伴们也可以叫我小曾&#xff0c;一个致力于测试开发的博主⛽️ 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a…