如何在Ada的AWS Web服务器中添加CORS响应头?
解决Ada AWS Web服务器添加CORS响应头的问题
你的代码存在两个核心问题导致CORS头未生效:
- 你创建的
Headers列表没有关联到最终返回的响应对象上,添加的CORS头从未被发送 - 未处理CORS预检的
OPTIONS请求,浏览器跨域请求前会先发该请求,必须正确响应才能让后续请求通过
以下是修复后的完整代码,附带关键修改说明:
with AWS.Client; with AWS.Response; with AWS.Server; with AWS.Server.Status; with AWS.Status; with Ada.Text_IO; with Ada.Strings.Unbounded; with AWS.Headers; procedure aws_test is WS : AWS.Server.HTTP; function HW_CB (Request : in AWS.Status.Data) return AWS.Response.Data is URI : constant String := AWS.Status.URI (Request); Method : constant String := AWS.Status.Method (Request); Response_Headers : AWS.Headers.List; response_data : AWS.Response.Data; begin -- 配置通用CORS响应头 AWS.Headers.Add (Table => Response_Headers, Name => "Access-Control-Allow-Origin", Value => "*"); AWS.Headers.Add (Table => Response_Headers, Name => "Access-Control-Allow-Methods", Value => "POST, GET, OPTIONS, PUT, DELETE"); AWS.Headers.Add (Table => Response_Headers, Name => "Access-Control-Allow-Headers", Value => "*"); AWS.Headers.Add (Table => Response_Headers, Name => "Access-Control-Max-Age", Value => "86400"); -- 处理OPTIONS预检请求 if Method = "OPTIONS" then return AWS.Response.Build ("text/plain", "", Response_Headers); end if; if URI = "/api/login" then declare para : Ada.Strings.Unbounded.Unbounded_String := AWS.Status.Binary_Data (Request); begin Ada.Text_IO.Put_Line (Ada.Strings.Unbounded.To_String (para)); -- 构建响应时传入配置好的CORS头 response_data := AWS.Response.Build ("text/html", "<p>Hello world !", Response_Headers); return response_data; end; else -- 其他路径同样返回带CORS头的响应 return AWS.Response.Build ("text/html", "<p>Hum...", Response_Headers); end if; end HW_CB; begin AWS.Server.Start (WS, "Hotel AI", Callback => HW_CB'Unrestricted_Access, Port => 8_080); delay 20.0; AWS.Server.Shutdown (WS); while not AWS.Server.Status.Is_Shutdown (WS) loop delay 5.0; end loop; end aws_test;
关键修改点:
- 将
Response_Headers定义在回调内部,确保每次请求使用全新的头列表,避免全局变量的累积问题 - 新增
OPTIONS请求处理逻辑,直接返回带CORS头的空响应,满足浏览器预检要求 - 调用
AWS.Response.Build时传入配置好的Response_Headers,让头信息正确附加到响应中 - 移除了原代码中未使用的变量,简化代码结构
修改后,服务器会正确返回CORS响应头,解决JavaScript中的跨域报错问题。
内容的提问来源于stack exchange,提问作者Nicolas Bachmaier
相关产品推荐
相关产品推荐

