一看就会的nestjs解决跨域

简介: 一看就会的nestjs解决跨域

什么是跨域

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


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


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


域名不同:当请求的域名与当前页面的域名不同。

协议不同:当请求的协议与当前页面的协议不同,例如从 HTTP 页面请求 HTTPS 接口。

端口不同:当请求的端口与当前页面的端口不同。

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


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


同源安全策略

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


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


协议相同:请求的协议必须与页面的协议一致,即请求的协议必须是HTTP或HTTPS,否则就会被视为跨域请求。

域名相同:请求的域名必须与页面的域名一致,包括子域名。两个页面的域名要完全相同才满足同源策略,例如,和不属于同一个源。http://example.comhttp://www.example.com

端口相同:请求的端口号必须与页面的端口号一致。如果页面使用默认的HTTP端口80或HTTPS端口443,则可以省略端口号,否则必须与页面的端口相同。

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


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


跨域资源共享(CORS):服务器在响应中设置CORS头部,允许指定的域名进行跨域访问。

JSONP:利用<script>标签加载外部资源的方式进行跨域请求。

代理服务器:通过自己的服务器作为中间代理,将请求发送到目标服务器并返回结果。在前端我们配置的server proxy代理就是这种

WebSocket:使用WebSocket协议进行全双工通信,不受同源策略限制。

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


nestjs解决跨域

Nest 应用程序对象上调用CORS

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


image.png


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


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底层为我们提供了对应的方法供我们使用,大大简化了开发中遇到的问题。希望能够帮助到大家

相关文章
|
开发工具
【开发工具】赋予 webstorm terminal 管理员权限
【开发工具】赋予 webstorm terminal 管理员权限
956 1
|
JSON 资源调度 JavaScript
nodemon 启动问题:nodemon : 无法将“nodemon”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
【6月更文挑战第3天】在尝试运行`nodemon`时遇到错误,提示无法识别该命令。问题可能是缺少nodemon环境或系统不允许执行脚本。解决方法包括:首先尝试使用`npm install nodemon -g`全局安装nodemon,如果安装失败,可能需要以管理员权限打开PowerShell,执行`set-ExecutionPolicy RemoteSigned`,然后再次尝试安装。nodemon是一款用于Node.js开发的工具,能监控源码变化自动重启应用,常用于提高开发效率。安装后,通过`nodemon your-app.js`启动应用,可自定义配置如监听特定文件、扩展名或目录。
4489 1
|
JavaScript 前端开发 网络架构
Qiankun 微应用的路由配置方式
【10月更文挑战第4天】
891 58
|
网络安全 网络架构
公网IP与内网穿透与端口映射区别
公网IP(Public IP) 公网IP是全球互联网上可路由的IP地址,用于标识网络中的设备。这些IP地址是全球唯一的,可以用来访问互联网上的资源。 公网IP通常由互联网服务提供商(ISP)分配给网络中的设备,例如家庭路由器、服务器或计算机。 公网IP是公开可访问的,因此可以用来托管服务器、提供网络服务,或者访问互联网上的资源。
971 5
|
Web App开发 前端开发 JavaScript
前端开发必备神器大公开,用过的人都哭了:效率翻倍不是梦!
前端开发结合了创意与技术,本文介绍了几个提升开发效率的工具:Visual Studio Code、Webpack、Postman、GitHub 和 Chrome DevTools。这些工具分别在代码编辑、模块打包、API 测试、版本控制和网页调试等方面发挥重要作用,帮助开发者提高工作效率,优化项目管理。
296 4
|
前端开发 UED
next/dynamic的动态导入
next/dynamic的动态导入
|
SQL Java 数据库连接
sql injection violation, syntax error: syntax error, error in :‘**‘expect IDENTIFIER, actual IDENTIF
sql injection violation, syntax error: syntax error, error in :‘**‘expect IDENTIFIER, actual IDENTIF
506 0
|
API PHP
通义千问接入进阶:流式、文件、图片、上下文
通义千问接入进阶:流式、文件、图片、上下文
1369 0
|
中间件
[Nestjs] 解决跨域问题
在前后端开发中,经常遇到需要解决跨域问题。接下来简单介绍在Nestjs中解决跨域问题的方法
653 0
|
存储 缓存 Linux
探秘Linux块设备驱动程序:成为内核开发大师的第一步
探秘Linux块设备驱动程序:成为内核开发大师的第一步
1253 1