简介CORS代表跨域资源共享。它是一种基于HTTP标头检测的机制。通过控制HTTP-header,可以实现跨域资源的权限管理。功能。在之前的CORS详解文章中,我们已经对CORS有了一个基本的讲解。本文将从netty实现的角度来讲解如何在netty中实现CORS。服务端CORS配置熟悉CORS的朋友应该知道,所有的CORS操作都是在HTTP协议之上通过控制HTTP头来实现的。所以如果想在服务端实现CORS支持,其实是通过在HTTP协议的头部进行各种设置来实现的。为了方便大家的使用,netty提供了一个CorsConfig类来统一CORS头的设置。首先看CorsConfig类中定义的属性:privatefinalSetorigins;私有最终布尔值anyOrigin;启用私有最终布尔值;privatefinalSetexposeHeaders;私有最终布尔值allowCredentials;HttpMethod>allowedRequestMethods;privatefinalSetallowedRequestHeaders;私有最终布尔值allowNullOrigin;privatefinalMap>preflightHeaders;私人最终布尔短路;例如origins表示允许原点,anyOrigin表示允许所有原点。对应如下设置:Origin:exposeHeaders与Access-Control-Expose-Headers一一对应,表示server端允许client获取CORS资源的同时可以访问header信息时间。格式如下:Access-Control-Expose-Headers:[,]*allowCredentials表示是否开启CORS认证。指示服务器是否接受带有凭据字段的客户端请求。如果在预检请求中使用,则表示后续真实请求是否支持凭据。格式如下:Access-Control-Allow-Credentials:trueallowedRequestMethods表示允许访问资源的方法,主要用在预检请求中。其格式如下:Access-Control-Allow-Methods:[,]*allowedRequestHeaders用于预检请求中,表示真正可以作为请求使用的头字段。格式如下:Access-Control-Allow-Headers:[,]*当客户端向服务器发送OPTIONS方法时,出于安全考虑,因为服务器可能无法接受这些OPTIONS方法,客户端需要先发送一个预检请求,等待服务器响应,等待服务器确认,然后发送真正的请求。让我们举个例子。preflightHeaders表示服务器允许预检请求标头。shortCircuit指示请求是否是有效的CORS请求,如果请求被拒绝,则返回true。CorsConfigBuilderCorsConfig用来表示Cors的配置类,那么这个配置类怎么构造呢?我们看一下CorsConfig的构造函数:CorsConfig(finalCorsConfigBuilderbuilder){origins=newLinkedHashSet(builder.origins);anyOrigin=builder.anyOrigin;enabled=builder.enabled;exposeHeaders=builder.exposeHeaders;allowCredentials=建造者。允许凭据;maxAge=builder.maxAge;allowedRequestMethods=builder.requestMethods;allowedRequestHeaders=builder.requestHeaders;allowNullOrigin=builder.allowNullOrigin;preflightHeaders=builder.preflightHeaders;shortCircuit=builder.shortCircuit;}可以看到CorsConfig是通过CorsConfigBuilder来构造的。通过在CorsConfigBuilder中设置各种属性。CorsConfigBuilder提供了多种方法来设置属性。您可以使用此方法构造CorsConfig,如下所示:CorsConfigcorsConfig=CorsConfigBuilder.forAnyOrigin().allowNullOrigin().allowCredentials().build();CorsHandler有了corsConfig,我们还需要在nettyhandler中配置这个config,netty提供了一个CorsHandler类来专门处理corsConfig,这个类叫做CorsHandler。先看CorsHandler的构造函数:publicCorsHandler(finalCorsConfigconfig){this(Collections.singletonList(checkNotNull(config,"config")),config.isShortCircuit());}publicCorsHandler(finalListconfigList,booleanisShortCircuit){checkNonEmpty(configList,"configList");this.configList=configList;this.isShortCircuit=isShortCircuit;CorsHandler有两个构造函数,一个是传入CorsConfig,另一个是传入一个CorsConfig的列表。CorsHandler的主要工作原理是处理responseHeader并在channelRead时设置CORSheader。Netty对cors的支持前面我们已经讲过netty中cors的核心类和方法。最后一步是将cors支持类添加到netty管道。核心代码如下:publicvoidinitChannel(SocketChannelch){ChannelPipelinepipeline=ch.pipeline();pipeline.addLast(newHttpResponseEncoder());pipeline.addLast(newHttpRequestDecoder());pipeline.addLast(新的HttpObjectAggregator(65536));pipeline.addLast(newChunkedWriteHandler());CorsConfigcorsConfig=CorsConfigBuilder.forAnyOrigin().allowNullOrigin().allowCredentials().build();pipeline.addLast(新CorsHandler(corsConfig));pipeline.addLast(newCustResponseHandler());提供了足够的方法支持。大家可以直接使用。本文示例可参考:learn-netty4本文已收录于http://www.flydean.com/22-netty-cors/最流行的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!