后端 文章

从JSONP到CORS:跨域解决方案的技术演进与架构思考
前端
2024-02-12 0k

从JSONP到CORS:跨域解决方案的技术演进与架构思考

在Web开发领域,CORS(跨源资源共享)是每个前端开发者都会遇到的关键概念。但为什么我们如今使用CORS,而曾经流行的JSONP却逐渐退出历史舞台?本文将带您深入理解跨域解决方案从JSONP到CORS的技术演进历程。 第一部分:理解CORS - 跨域资源共享 什么是CORS? CORS(Cross-Origin Resource Sharing,跨源资源共享)是浏览器强制执行的一种安全机制,用于解决"同源策略"带来的限制。 同源策略要求协议、域名、端口完全相同的请求才被允许。例如: https://www.example.com → https://api.example.com ❌ 跨域 http://localhost:3000 → http://localhost:8080 ❌ 跨域 CORS的工作原理 当浏览器检测到跨域请求时,会执行以下流程: 发送预检请求:对于非简单请求,浏览器先发送OPTIONS请求 服务器响应:后端返回包含CORS头部的响应 浏览器验证:浏览器检查头部,决定是否放行 实际请求:验证通过后发送真正的请求 # 预检请求 OPTIONS /api/data HTTP/1.1 Origin: https://www.example.com Access-Control-Request-Method: POST # 服务器响应 HTTP/1.1 200 OK Access-Control-Allow-Origin: https://www.example.com Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: Content-Type 为什么配置服务端CORS就能解决问题? 关键在于:CORS的决定权在服务器,浏览器只是执行者。 当您在.NET服务端配置CORS时,有多种方式: ASP.NET Core 全局配置: // Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddCors(options => { options.AddPolicy("AllowSpecificOrigin", policy => { policy.

CORS JSONP 跨域
阅读更多
DDD领域驱动设计全面解析:.NET核心概念与落地实践指南
后端
2024-01-24 0k

DDD领域驱动设计全面解析:.NET核心概念与落地实践指南

DDD领域驱动设计全面解析:.NET核心概念与落地实践指南 领域驱动设计(Domain-Driven Design,简称 DDD)是一种以业务领域为核心的现代化软件架构设计方法论,专注于解决复杂企业级业务系统的设计与开发难题。在当今微服务架构和分布式系统盛行的环境下,DDD已成为构建高内聚、低耦合系统的最佳实践。本文将深入剖析DDD核心概念,结合.NET技术栈全面讲解DDD落地实践,帮助开发者掌握企业级应用架构设计精髓。 .NET 作为成熟稳定的企业级开发平台,天然支持 DDD 领域驱动设计的核心诉求 —— 无论是分层架构、面向对象设计,还是依赖注入、领域模型映射等,都能通过 ASP.NET Core、EF Core、MediatR 等 .NET 生态工具无缝落地。本文将从 DDD 领域驱动设计的核心思想出发,结合 .NET 实战场景,系统讲解 DDD 关键概念、架构分层及落地技巧,提供完整的企业应用架构解决方案。 一、DDD领域驱动设计核心思想:业务驱动的架构哲学 DDD领域驱动设计的本质是业务驱动而非技术驱动,所有设计决策都围绕业务需求展开,在 .NET 企业应用开发中,核心遵循三大原则: 领域优先:业务逻辑(领域模型)是系统的核心资产,技术细节(数据库、API、缓存等)仅作为辅助实现; 边界清晰:通过「限界上下文」划分业务边界,解决复杂系统中的 “知识混乱”,避免不同业务模块的概念冲突; 迭代演进:通过「领域语言(Ubiquitous Language)」统一团队(开发、产品、测试)认知,领域模型随业务迭代持续优化。 二、DDD核心概念详解与.NET落地实践 DDD 的概念体系可分为「领域层核心概念」「架构分层」「辅助概念」三类,以下结合 .NET 代码示例和生态工具逐一说明。 (一)领域层核心概念:DDD业务逻辑的核心载体 领域层是 DDD 的 “心脏”,包含业务模型、规则和行为,不依赖任何外部技术框架,纯业务逻辑封装。 1. 领域模型(Domain Model)- DDD核心设计元素 领域模型是业务概念的代码映射,分为两种设计风格: 贫血模型:仅包含属性和 getter/setter,无业务逻辑(传统 MVC 常用,非 DDD 推荐); 充血模型:包含属性 + 业务逻辑方法(DDD 核心),模型自身封装业务规则,确保数据一致性。 .

DDD 领域驱动设计 dotnet
阅读更多
天气查询API实现 | 后端开发最佳实践
后端
2023-12-25 0k

天气查询API实现 | 后端开发最佳实践

1. 天气查询功能介绍 天气查询API在现代Web和移动应用中扮演着重要角色,它可以为用户提供实时天气数据、未来天气预报以及生活指数等关键信息。本文将详细介绍如何实现一个高效、稳定的天气查询服务,涵盖从API选择、异步编程实现到缓存优化的完整开发流程。 2. 天气API服务选择指南 在开发天气查询应用时,选择合适的API服务提供商至关重要。以下是几个主流的天气API服务对比: 和风天气API:国内数据覆盖全面,API文档完善,适合后端开发使用 OpenWeatherMap:全球天气数据服务,国际化支持好 高德地图天气API:国内覆盖较全面,适合本地化应用 百度地图天气API:与百度地图集成良好,适合地图应用场景 本文以和风天气API为例,详细讲解调用天气API的完整实现方案,包括API密钥获取、请求构建、响应解析和错误处理等关键环节。 3. 天气查询API代码实现 3.1 获取和风天气API密钥 在开始天气查询开发前,首先需要在和风天气开发者平台注册账号并获取API密钥。注册流程简单,完成后即可获得免费额度的API访问权限。 3.2 天气查询类实现 using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; public class WeatherAPI { private readonly string _apiKey; private readonly string _baseUrl; private readonly HttpClient _httpClient; public WeatherAPI(string apiKey) { _apiKey = apiKey; _baseUrl = "https://devapi.qweather.com/v7"; _httpClient = new HttpClient(); _httpClient.Timeout = TimeSpan.FromSeconds(10); } /// <summary> /// 实现获取指定位置的实时天气数据 /// 支持城市ID或经纬度查询 /// </summary> public async Task<Dictionary<string, object>> GetCurrentWeatherAsync(string location) { string url = $"{_baseUrl}/weather/now"; var parameters = new Dictionary<string, string> { { "key", _apiKey }, { "location", location } // 可以是城市ID或经纬度 }; try { using (var response = await _httpClient.

C#天气查询 ASP.NET Core开发 和风天气API调用
阅读更多
DotNet Core 项目 添加Swagger 自动构建接口文档
后端
2020-06-08 0k

DotNet Core 项目 添加Swagger 自动构建接口文档

1、NuGet引用 Swashbuckle.AspNetCore 2、Startup类中ConfigureServices函数添加代码 #region Swagger public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); #region Swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Version = "1.0", Title = "SwaggerDemo API", Description = "SwaggerDemo文档", TermsOfService = "None", Contact = new Swashbuckle.AspNetCore.Swagger.Contact { Name = "SwaggerDemo", Email = "raikay@163.com", Url = "http://www.raikay.cn/" } }); }); #endregion } #endregion 3、启动Http中间件:编辑Configure类 public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } #region Swagger app.UseSwagger(); app.UseSwaggerUI(c => { c.

dotnet swagger .NET Core
阅读更多
什么是JWT? Json Web Token介绍
后端
2020-05-16 0k

什么是JWT? Json Web Token介绍

什么是jwt? JWT 英文名是 Json Web Token ,是一种用于通信双方之间传递安全信息的简洁的、URL安全的表述性声明规范,经常用在跨域身份验证。 JWT 以 JSON 对象的形式安全传递信息。因为存在数字签名,因此所传递的信息是安全的。 由三部分组成: Header(头部) Payload(数据) Signature(签名) JWT=头部编码+数据编码+加密(头部编码+数据编码+key) 编码采用base64编码,加密采用头部alg声明编码方式加密 一:头部(Header) JWT 头描述了 JWT 元数据,是一个 JSON 对象,它的格式如下: {"typ":"JWT","alg":"HS256"} 这里的 alg 属性表示签名所使用的算法,JWT 签名默认的算法为 HMAC SHA256 , alg 属性值 HS256 就是 HMAC SHA256 算法。typ 属性表示令牌类型,这里就是 JWT。 Base64编码后是下面这样: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 二:载荷(playload) 有效载荷是 JWT 的主体,同样也是个 JSON 对象。有效载荷包含三个部分: 1、标准注册声明: 标准注册声明不是强制使用是的,但是我建议使用。它一般包括以下内容: iss:jwt的签发者/发行人; sub:主题; aud:接收方; exp:jwt过期时间; nbf:jwt生效时间; iat:签发时间 jti:jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。 2、公共声明: 可以在公共声明添加任何信息,我们一般会在里面添加用户信息和业务信息,但是不建议添加敏感信息,因为公共声明部分可以在客户端解密。 3、私有声明: 私有声明是服务器和客户端共同定义的声明,同样这里不建议添加敏感信息。 下面这个代码段就是定义了一个有效载荷: {"sub":"1234567890","name":"John Doe","admin":true} Base64编码: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9 三:签名(signature) 这个部分主要是确保数据不会被篡改,需要base64加密后的header和base64加密后的payload使用.

JWT 单点登录 http
阅读更多
使用Docker部署Apollo一个环境docker-quick-start版
后端
2020-04-05 0k

使用Docker部署Apollo一个环境docker-quick-start版

1、下载Apollo源码 git clone https://github.com/ctripcorp/apollo.git 2、进入docker-quick-start 目录 cd apollo/scripts/docker-quick-start 3、安装启动 docker-compose up 看到下面日志表示已经安装成功 apollo-quick-start | Waiting for config service startup..... apollo-quick-start | Config service started. You may visit http://localhost:8080 for service status now! apollo-quick-start | Waiting for admin service startup. apollo-quick-start | Admin service started apollo-quick-start | ==== starting portal ==== apollo-quick-start | Portal logging file is ./portal/apollo-portal.log apollo-quick-start | Started [237] apollo-quick-start | Waiting for portal startup..... apollo-quick-start | Portal started.

apollo docker 配置中心
阅读更多
Docker环境安装及基础命令使用
后端
2020-04-03 0k

Docker环境安装及基础命令使用

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 安装Docker 为yum配置加速 centos默认国外源,安装过程不是很理想 #下载阿里yum源2 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all #清理缓存 yum makecache #生成仓库缓存 安装: 1、安装必要依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 2、添加阿里镜像稳定版仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3、安装docker-ce yum install -y docker-ce docker-ce-cli containerd.io 配置docker加速 创建或修改 daemon.json 文件 修改之后重启docker服务 vim /etc/docker/daemon.json { "registry-mirrors" : [ "http://registry.docker-cn.com", "http://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "insecure-registries" : [ "registry.docker-cn.com", "docker.mirrors.ustc.edu.cn" ], "debug" : true, "experimental" : true } 开机启动 systemctl enable docker #开机启动docker 重启 systemctl daemon-reload #加载 systemctl restart docker #重启docker 查看 systemctl status docker #查看docker状态 docker info #查看详细信息 docker version #查看版本 使用Docker 查看已有镜像列表

docker 环境安装 国内源
阅读更多
.Net Core项目使用Docker容器部署到Linux服务器Centos7
后端
2020-02-11 0k

.Net Core项目使用Docker容器部署到Linux服务器Centos7

创建项目 选择 ASP.NET Core Web 应用程序 可以在创建时直接勾选【启用Docker支持】选择Linux(图1),也可以在已有项目右键添加Docker支持(图2) 图1 图2 项目发送至Linux服务器,我这里是上传到github,然后在linux服务器通过github下载项目 git下载项目 git clone https://github.com/raikay/firstdemo.git 构建镜像 docker build -t firstdemo . -f firstdemo/Dockerfile 如果构建dotnet环境太慢,可以使用腾讯加速镜像下载 docker pull ccr.ccs.tencentyun.com/dotnet-core/aspnet:3.1-buster-slim docker tag ccr.ccs.tencentyun.com/dotnet-core/aspnet:3.1-buster-slim mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim docker pull ccr.ccs.tencentyun.com/dotnet-core/sdk:3.1-buster docker tag ccr.ccs.tencentyun.com/dotnet-core/sdk:3.1-buster mcr.microsoft.com/dotnet/core/sdk:3.1-buster docker build -t firstdemo . -f firstdemo/Dockerfile 运行镜像 docker run -d -p 1080:80 --name myfirstdemo firstdemo 浏览器访问 http://192.168.198.131:1080/WeatherForecast 浏览器显示效果 Dockerfile解释 #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

DotNet Docker Centos
阅读更多
Dto / Model / Entity 区别
后端
2020-02-11 0k

Dto / Model / Entity 区别

Entity 数据表对应到实体类的映射 Model Model是MVC中一个概念,可能不和Entity一一对应,因为展示在View层中数据可能是一个Entity的精简,也可能是多个Entity的组合。 Model是一个高度优化组合或者精简后的一个用于在View层展示数据的对象。 DTO 数据传输对象(Data Transfer Object)。 用于系统间数据传输的对象,数据传输目标往往是数据访问对象从数据库中检索数据。 鸣谢: https://www.zhihu.com/question/25256772 http://www.liuhuachao.com/blog/2018/05/20/entity-model-dto/

dotnet DTO Model
阅读更多
Linux系统Centos7部署DotNet Core项目及环境安装
后端
2019-09-06 0k

Linux系统Centos7部署DotNet Core项目及环境安装

1、环境安装及项目运行 安装 dotnet core #使用微软官方的源 sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm #更新软件源 sudo yum update #可以先搜索看一下列表 #yum search dotnet #安装 sudo yum install -y dotnet-sdk-3.1.x86_64 #查看是否安装成功 dotnet --version 下载项目 git clone https://github.com/raikay/firstdemo.git 生成项目 #进入生成目录 cd firstdemo/firstdemo #生成 dotnet publish -c release -o "publish" # -c 指定release; -o 指定生成目录 运行项目 dotnet firstdemo.dll --urls http://0.0.0.0:80 浏览器访问地址查看结果 http://192.168.198.131/WeatherForecast 至此已经成功运行! 2、supervisor创建守护进程 到上面的步骤程序运行没问题了,但是如果退出当前控制台,程序就会结束运行。 我们可以使用supervisor托管程序,创建守护进程,使程序持续运行。 安装supervisor yum install -y epel-release #安装扩展源 yum install -y supervisor 进入 supervisor控制台 supervisorctl 可以进入 supervisor 控制台,表示服务安装成功,并已成功启动

dotnet .NET Core Linux
阅读更多