一看就会的nestjs解决跨域-程序员宅基地

技术标签: node.js  nestjs  typescript  后端  

目录

什么是跨域

同源安全策略

nestjs解决跨域

 Nest 应用程序对象上调用CORS

中间件(middleware)配置

总结

什么是跨域

跨域(Cross-Origin)指的是在浏览器中,当一个网页的 JavaScript 代码向不同源(协议、域名或端口)的服务器发送请求时,就会发生跨域。例如,如果一个网页在域名为"example.com"的服务器上运行,它的 JavaScript 代码尝试向"api.example2.com"这个不同的域名发送请求,那么就会发生跨域请求。

浏览器实施同源策略(Same-Origin Policy)来限制跨域请求。同源策略要求网页的 JavaScript 只能访问与其来源相同的资源,也就是协议域名端口都必须相同。这是为了保障用户的安全性,防止恶意网站获取用户的敏感数据或执行未授权的操作。

跨域可以出现在以下情况下:

  1. 域名不同:当请求的域名与当前页面的域名不同。
  2. 协议不同:当请求的协议与当前页面的协议不同,例如从 HTTP 页面请求 HTTPS 接口。
  3. 端口不同:当请求的端口与当前页面的端口不同。

跨域请求通常是被浏览器阻止的,除非服务器在响应中设置了 CORS(跨域资源共享)头部,或者使用其他跨域解决方案,如 JSONP、代理服务器、WebSocket 等。

在开发 Web 应用程序时,需要注意跨域问题,并根据需要采取适当的措施,以确保跨域请求的安全性和合法性。

同源安全策略

同源安全策略(Same-Origin Policy)是浏览器中一种基本的安全机制,用于保护用户的信息安全和防止恶意网站的攻击。同源安全策略定义了浏览器如何限制跨域请求以及访问跨域资源的规则。

同源安全策略要求在保护用户隐私和安全的前提下,只有当以下三个条件满足时,才允许不受限制地进行跨域资源访问:

  1. 协议相同:请求的协议必须与页面的协议一致,即请求的协议必须是HTTP或HTTPS,否则就会被视为跨域请求。
  2. 域名相同:请求的域名必须与页面的域名一致,包括子域名。两个页面的域名要完全相同才满足同源策略,例如,和不属于同一个源。http://example.comhttp://www.example.com
  3. 端口相同:请求的端口号必须与页面的端口号一致。如果页面使用默认的HTTP端口80或HTTPS端口443,则可以省略端口号,否则必须与页面的端口相同。

同源安全策略的限制适用于许多跨域请求方式,包括通过XMLHttpRequest对象发送的Ajax请求、动态创建的、<script>或<link>标签携带的资源请求等。

如果需要进行跨域请求或访问跨域资源,可以通过以下方式来解决同源安全策略的限制:

  1. 跨域资源共享(CORS):服务器在响应中设置CORS头部,允许指定的域名进行跨域访问。
  2. JSONP:利用<script>标签加载外部资源的方式进行跨域请求。
  3. 代理服务器:通过自己的服务器作为中间代理,将请求发送到目标服务器并返回结果。在前端我们配置的server proxy代理就是这种
  4. WebSocket:使用WebSocket协议进行全双工通信,不受同源策略限制。

总之,同源安全策略是浏览器的一项重要安全机制,用于限制跨域请求和资源访问,确保用户的隐私和安全。开发者需要在遇到跨域问题时,根据具体情况选择适当的解决方案来绕过同源安全策略的限制。


nestjs解决跨域

 Nest 应用程序对象上调用CORS

在nestjs底层中使用了Express的Cors包,用法类似,只需在main.ts中加入一行代码

 它可以根据请求(动态)异步定义配置对象,例如

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.enableCors({
    origin: true,
    methods: 'GET,PUT,POST',
    allowedHeaders: 'Content-Type,Authorization',
    exposedHeaders: 'Content-Range,X-Content-Range',
    credentials: true,
    maxAge: 3600,
  });

  await app.listen(3000);
}
bootstrap();

还可以在app上面配置,它可以接受三种类型的参数,Boolean,Options配置项,回调函数,用法很简单,具体配置项看Cors官方文档 ExpressJS / CORS

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, { cors: true });
  await app.listen(3000);
}
bootstrap();

中间件(middleware)配置

创建一个中间件类,例如CorsMiddleware

import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class CorsMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    // 在这里配置跨域相关的逻辑
    const allowedOrigins = ['http://example1.com', 'http://example2.com']; // 允许的源
    const requestOrigin = req.header('Origin');
    
    if (allowedOrigins.includes(requestOrigin)) {
      res.setHeader('Access-Control-Allow-Origin', requestOrigin);
      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
      res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
    }

    next();
  }
}

在特定模块中使用

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CorsMiddleware } from './cors.middleware';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(CorsMiddleware)
      .forRoutes('*'); // 设置需要应用中间件的路由路径,此处为所有路由
  }
}

这样,当应用程序接收到请求时,中间件将会被调用进行跨域的处理操作,配置的回调函数将被执行,并且会添加适当的 CORS 头部到响应中。请根据自己的需求进行相应的配置和处理逻辑。


总结

跨域问题是最常见的问题了,现在前端,后端,ng都能解决,而nest底层为我们提供了对应的方法供我们使用,大大简化了开发中遇到的问题。希望能够帮助到大家

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_63204040/article/details/131367490

智能推荐

x265 命令行参数大全(比较详细)_x265参数-程序员宅基地

文章浏览阅读2.2k次。除非一个参数被标记为 CLI ONLY,否则该参数也被x265_param_parse() 支持。CLI使用getopt 函数来解释命令行参数,长短版本的参数都可以使用,长参数在不引起歧义的情况下可以截断成短参数。API用户必须把完整的参数名传递给 x265_param_parse()。Preset和tune 有特殊的含义,API用户需要在调用x265_param_parse()设置其他参数之前使..._x265参数

阿里发布的Java高并发开发文档,涵盖了所有的高并发操作!-程序员宅基地

文章浏览阅读307次。而今天分享的这份阿里内网“M9级全彩高并发编程手册”,让大家不仅能够学到深度、专业的编程知识,还能感受到阿里专注地提高编程技能的态度,始终如一地贡献、分享Java专业知识与经验的精神,以及持续学习、持续成长的进取精神,文末附高清电子版。看干货获取方式扫描下方公众号【java1234】回复:9966,可获取下载链接????????????????长按上方二维码2 秒回复「9966」即可如果不会领取,或者需要其他java..._m9级全彩高并发编程手册

-----已搬运-------关于prreg_match()的绕过 ----- %0a ------ 数组 --------preg的回调次数 ----科学计数法绕过。。。_regmatch 绕过-程序员宅基地

文章浏览阅读1.3k次。1. 例题一<?phpshow_source(__FILE__);function areyouok($greeting){ return preg_match('/$Merry.*Christmas/is',$greeting);}$greeting=@$_REQUEST['greeting'];if(!areyouok($greeting)){ if(strpos($greeting,'Merry Christmas')!==false){ echo_regmatch 绕过

【摄影】入门教程_摄影学习博客-程序员宅基地

文章浏览阅读493次。焦距是视野的范围的区间,焦距越小,视野越大,画面所容纳的东西越多,同时单个主题的占比就会越小。焦距的单位是mm(毫米)。其他分类镜头上的f值来表示光圈,光圈越大,f值越小。恒定光圈镜头优于浮动光圈镜头,恒定光圈越大,镜头等级越高。变焦镜头还包括外变焦镜头(拧动变焦环的时候,镜头长短有变化)和内变焦镜头(镜头长短没有变化)利用手机完全可以学好摄影,拍出好看的照片,如下是苹果手机摄影获奖作品。_摄影学习博客

生鲜超市 学习进阶第三天 xadmin的后台管理_mxshop\extra_apps\xadmin-程序员宅基地

文章浏览阅读454次。1.配置urlfrom django.urls import pathimport xadminfrom django.urls import includeurlpatterns = [ path('xadmin/', xadmin.site.urls), path('ueditor/', include('DjangoUeditor.urls')),]2.注册..._mxshop\extra_apps\xadmin

java jsession_cookie、session、jsession 关系-程序员宅基地

文章浏览阅读273次。在使用CAS的时候,对Cookies、session、jsession 这三者是什么不是很了解。翻阅资料和实践后终于明白这三者的概念和它们的用处。一、http我们知道网页的传输大部分基于http协议。HTTP协议的主要特点可概括如下:1.支持客户/服务器模式。2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类..._jsession session

随便推点

2024年10个最佳人工智能视频生成器、10个最佳人工智能转录软件和服务、10个最佳人工智能语音生成器、10个最佳文本转语音生成器,优缺点对比分析及附访问地址可打开直接使用_脚本自动生成视频 软件-程序员宅基地

文章浏览阅读1.1k次,点赞16次,收藏23次。2024年10个最佳人工智能视频生成器、10个最佳人工智能转录软件和服务、10个最佳人工智能语音生成器、10个最佳文本转语音生成器,优缺点对比分析及附访问地址可打开直接使用。_脚本自动生成视频 软件

echarts 柱状图图例点击事件并动态调整平均值_echarts 图例 selected动态赋值-程序员宅基地

文章浏览阅读846次。今天来记录一下之前遇到的问题,当时有个需求是点击柱状图的图例,显示不同的堆叠图,并且其中有一条虚线来显示当前高亮的堆叠图的数据平均值,页面功能效果实现代码如下 myChart.on('legendselectchanged', barfunction) function barfunction(obj) { let selectedItem = [] // 当前选中的高亮名 let totalArr = [] // 分母 let unitP_echarts 图例 selected动态赋值

Element-UI中el-table表格样式的修改_element ui table column行内style-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏31次。1. el-table整个容器的样式 标签的style中设置<el-table style = "样式"></el-table>2. el-table表头的样式修改<el-table :header-cell-style = "函数名称"></el-table>header-cell-style绑定的函数返回的是表头的样式函数在method..._element ui table column行内style

Hadoop环境搭建问题汇总_org.apache.hadoop.ipc.rpc-程序员宅基地

文章浏览阅读5.2k次。启动HDFS时dataNode一直没有启动我们执行hdfs启动命令后,再输入 jps 命令查看启动进程,发现没有DataNode进程hadoop namenode -formatsbin/start-dfs.sh原因当我们使用 hadoop namenode -format 格式化namenode时,会在namenode数据文件夹(这个文件夹为自己配置文件中dfs.nam..._org.apache.hadoop.ipc.rpc

awk 取绝对值最大_awk绝对值函数-程序员宅基地

文章浏览阅读7.1k次。[root@centos6-1 ~]# cat infile aaa -1aaa -2aaa -3aaa 28aaa -22bbb -2bbb -4bbb -6ccc -2ccc -3ccc -8ccc -10ddd -2ddd -4ddd -12[root@centos6-1 ~]# [root@centos6-1 ~]# [ro_awk绝对值函数

Android 解决ScrollView嵌套EditText滑动冲突_android edittext scrollview滑动冲突-程序员宅基地

文章浏览阅读356次。ScrollView嵌套多行的EditText时,EditText内容滑动不了。et.setOnTouchListener((view, motionEvent) -> { if ((view.getId() == R.id.et && canVerticalScroll(et))) { view.getParent().requestDisallowInterceptTouchEvent(true); if (motionEvent.getAction() == _android edittext scrollview滑动冲突

推荐文章

热门文章

相关标签