文章目录

  • 简介
  • 服务端的CORS配置
  • CorsConfigBuilder
  • CorsHandler
  • netty对cors的支持
  • 总结

简介

CORS的全称是跨域资源共享,他是一个基于HTTP-header检测的机制,通过对HTTP-header进行控制,可以实现对跨域资源的权限管理功能。在之前的CORS详解文章中,我们已经对CORS有了基本的解释。

本文将会从netty的实现角度,讲解如何在netty中实现CORS。

服务端的CORS配置

熟悉CORS的朋友应该知道,CORS所有的操作都是在HTTP协议之上通过控制HTTP头来实现的。所以说如果要在服务器端实现CORS的支持,事实上也是对HTTP协议的头进行各种设置完成的。

为了方便大家的使用,netty提供了一个CorsConfig类,来统一CORS的头设置。

先看下CorsConfig类中定义的属性:

    private final Set<String> origins;private final boolean anyOrigin;private final boolean enabled;private final Set<String> exposeHeaders;private final boolean allowCredentials;private final long maxAge;private final Set<HttpMethod> allowedRequestMethods;private final Set<String> allowedRequestHeaders;private final boolean allowNullOrigin;private final Map<CharSequence, Callable<?>> preflightHeaders;private final boolean shortCircuit;

这些属性和CORS的HTTP头设置是一一对应的。比如说origins表示的是允许的源,anyOrigin表示允许所有的源。

是和下面的设置对应的:

Origin: <origin>

exposeHeaders是和Access-Control-Expose-Headers一一对应的,表示服务器端允许客户端获取CORS资源的同时能够访问到的header信息。其格式如下:

Access-Control-Expose-Headers: <header-name>[, <header-name>]*

allowCredentials表示是否开启CORS的权限认证。表示服务器端是否接受客户端带有credentials字段的请求。如果用在preflight请求中,则表示后续的真实请求是否支持credentials,其格式如下:

Access-Control-Allow-Credentials: true

allowedRequestMethods表示访问资源允许的方法,主要用在preflight request中。其格式如下:

Access-Control-Allow-Methods: <method>[, <method>]*

allowedRequestHeaders用在preflight request中,表示真正能够被用来做请求的header字段,其格式如下:

Access-Control-Allow-Headers: <header-name>[, <header-name>]*

当客户端发送OPTIONS方法给服务器的时候,为了安全起见,因为服务器并不一定能够接受这些OPTIONS的方法,所以客户端需要首先发送一个
preflighted requests,等待服务器响应,等服务器确认之后,再发送真实的请求。我们举一个例子。preflightHeaders表示的就是服务器允许额preflight的请求头。

shortCircuit表示请求是否是一个有效的CORS请求,如果请求被拒绝之后,就会返回一个true。

CorsConfigBuilder

CorsConfig使用来表示Cors的配置类,那么怎么去构造这个配置类呢?我们看下CorsConfig的构造函数:

    CorsConfig(final CorsConfigBuilder builder) {origins = new LinkedHashSet<String>(builder.origins);anyOrigin = builder.anyOrigin;enabled = builder.enabled;exposeHeaders = builder.exposeHeaders;allowCredentials = builder.allowCredentials;maxAge = builder.maxAge;allowedRequestMethods = builder.requestMethods;allowedRequestHeaders = builder.requestHeaders;allowNullOrigin = builder.allowNullOrigin;preflightHeaders = builder.preflightHeaders;shortCircuit = builder.shortCircuit;}

可以看到CorsConfig是通过CorsConfigBuilder来构造的。通过设置CorsConfigBuilder中的各种属性即可。CorsConfigBuilder中提供了多种设置属性的方法。

可以使用这样的方法来构造CorsConfig如下:

CorsConfig corsConfig = CorsConfigBuilder.forAnyOrigin().allowNullOrigin().allowCredentials().build();

CorsHandler

有了corsConfig,我们还需要将这个config配置在netty的handler中,netty提供了一个CorsHandler类来专门处理corsConfig,这个类就叫CorsHandler。

首先看下CorsHandler的构造函数:

    public CorsHandler(final CorsConfig config) {this(Collections.singletonList(checkNotNull(config, "config")), config.isShortCircuit());}public CorsHandler(final List<CorsConfig> configList, boolean isShortCircuit) {checkNonEmpty(configList, "configList");this.configList = configList;this.isShortCircuit = isShortCircuit;}

CorsHandler有两个构造函数,一个是传入CorsConfig,一个是传入一个CorsConfig的列表。

CorsHandler的主要工作原理就是在channelRead的时候,对responseHeader进行处理,设置CORS头。

netty对cors的支持

上面我们已经讲过了netty中cors的核心类和方法,最后一步就是把cors的支持类加入到netty的pipeline中,其核心代码如下:

    public void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new HttpResponseEncoder());pipeline.addLast(new HttpRequestDecoder());pipeline.addLast(new HttpObjectAggregator(65536));pipeline.addLast(new ChunkedWriteHandler());CorsConfig corsConfig = CorsConfigBuilder.forAnyOrigin().allowNullOrigin().allowCredentials().build();pipeline.addLast(new CorsHandler(corsConfig));pipeline.addLast(new CustResponseHandler());}

总结

cors比较简单,netty也为其提供了住够的方法支持。大家可以直接使用。

本文的例子可以参考:learn-netty4

本文已收录于 http://www.flydean.com/22-netty-cors/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

netty系列之:在netty中处理CORS相关推荐

  1. 【Netty系列_3】Netty源码分析之服务端channel

    highlight: androidstudio 前言 学习源码要有十足的耐性!越是封装完美的框架,内部就越复杂,源码很深很长!不过要抓住要点分析,实在不行多看几遍,配合debug,去一窥优秀框架的精 ...

  2. Netty系列二、Netty原理篇

    文章目录 一.Netty概述 二.Netty整体架构设计 1.Reactor模型 2.Reactor模型分类 2.1 单Reactor单线程 2.2 单Reactor多线程 2.3 多Reactor多 ...

  3. netty系列之:在netty中使用protobuf协议

    文章目录 简介 定义protobuf 定义handler 设置ChannelPipeline 构建client和server端并运行 总结 简介 netty中有很多适配不同协议的编码工具,对于流行的g ...

  4. netty系列之:使用netty搭建websocket客户端

    文章目录 简介 浏览器客户端 netty对websocket客户端的支持 WebSocketClientHandshaker WebSocketClientCompressionHandler net ...

  5. netty系列之:使用netty搭建websocket服务器

    文章目录 简介 netty中的websocket websocket的版本 FrameDecoder和FrameEncoder WebSocketServerHandshaker WebSocketF ...

  6. netty系列之:请netty再爱UDT一次

    文章目录 简介 netty对UDT的支持 搭建一个支持UDT的netty服务 异常来袭 TypeUDT和KindUDT 构建ChannelFactory SelectorProviderUDT 使用U ...

  7. 【Netty系列】使用Netty搭建WebSocket服务器

    使用Netty搭建WebSocket服务器 引入netty的依赖 <dependency><groupId>io.netty</groupId><artifa ...

  8. netty系列之:netty架构概述

    文章目录 简介 netty架构图 丰富的Buffer数据机构 零拷贝 统一的API 事件驱动 其他优秀的特性 总结 简介 Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架 ...

  9. 1. 彤哥说netty系列之开篇(有个问卷调查)

    你好,我是彤哥,本篇是netty系列的第一篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 本文主要讲述netty系列的整体规划,并调查一下大家喜欢的学习方式. 知识点 ne ...

最新文章

  1. Python使用numpy包编写自定义函数计算平均绝对误差(MAE、Mean Absolute Error)、评估回归模型和时间序列模型、解读MAE
  2. 移动web注意事项 转
  3. android 自定义 打包文件类型,Android设置apk打包文件名报错
  4. java导出数据到excel模板_springboot+jxls 根据Excel模板 填写数据并导出
  5. 【codevs1946】【BZOJ2434】阿狸的打字机,AC自动机练习
  6. 【防爬虫01】通过headers中的user-agent字段来反爬
  7. MIPS 通用寄存器 + 指令
  8. 如何用电脑录制GIF动态图
  9. JS函数式编程——来源freecodecamp
  10. 从“H1N1病毒”看危机意识的重要性
  11. sails框架配置相关
  12. STM32 PWM控制舵机
  13. 顺丰笔试-赏金猎人2020-08-20(参考时间最大利益)
  14. 小程序input textarea 对齐问题
  15. CentOs7下载与安装
  16. MIPI DSI协议
  17. curl 支持ws吗_使用CURL请求WebService | 字痕随行
  18. 我国逸管家中小企业融资难现状及分析(含开题报告、实践报告)(20180404105041)
  19. Feelings On Life II
  20. 虚拟数字人市场现状研究分析-

热门文章

  1. 贪心算法-03哈夫曼编码问题
  2. python高级语法-collections模块下几个新序列
  3. HDU3255(线段树+扫描线)
  4. 利用找因子来找方程解的个数
  5. 第12讲:Ajax 的原理和解析
  6. 秒懂 QPS、TPS、PV、UV、GMV、IP、RPS!
  7. 在业务系统中寻求技术含量
  8. 意犹未尽 —— GPM 的状态流转(十)
  9. Leetcode-Merge k Sorted Lists
  10. 音视频技术开发周刊 | 165