CORS AWS使用Lambda(JAVA)

4
我正在使用具有Java Lambda后端的AWS API Gateway。 一切都很顺利,直到一个使用Angular 4的朋友试图发起请求。他一直收到以下错误信息: “跨源请求被阻止:Same Origin Policy不允许读取远程资源的URL(原因:缺少CORS标头'Access-Control-Allow-Origin')。” 我已经通过网关启用了CORS。

AWS image

尽管如此,错误仍然存在。我应该修改什么?谢谢。Ian的评论:根据您的评论,我使用输出/输入流进行输出,但仍然没有成功。有什么想法吗?
private void sendResponse(JSONObject body, int statusCode, OutputStream outputStream)
{   
    OutputStreamWriter writer;                                                             
    JSONObject responseJson = new JSONObject(); 
    JSONObject responseHeadersJson = new JSONObject();
    responseHeadersJson.put("Access-Control-Allow-Origin","*");
    responseHeadersJson.put("Access-Control-Allow-Headers","Content-Type");

    responseJson.put("headers",responseHeadersJson);
    responseJson.put("statusCode", statusCode);
    responseJson.put("body", body.toJSONString());          
    try {
        writer = new OutputStreamWriter(outputStream, "UTF-8");
        writer.write(responseJson.toJSONString());  
        writer.close(); 
    } catch (IOException e) {
        System.out.println("Outputstream Error "+e);
    }}

你能验证头部信息 'Access-Control-Allow-Origin' 是否存在,并且是否完全等于你设置的 '*' 吗?我认为你应该使用 https://www.getpostman.com/ 进行测试。 - Mayur Padshala
可以在Chrome网络面板中检查,或者进行curl请求并查看请求的响应头。此外,这不是Angular特定的问题,而是JS在浏览器中跨域进行AJAX调用时的问题。如果浏览器没有设置跨域标头,则会自动在任何POST或GET请求之前进行OPTIONS请求以获取标头信息,如果没有跨域标头,则请求将被拒绝。https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy - shaunhusain
1个回答

3

我看到您正在使用代理资源。

这意味着您也在控制从Lambda返回的响应,需要在响应中添加来源头来配置CORS。

构建响应时,您需要通过传递域名或*来添加CORS标头。

我已经构建了一个ResponseBuilder示例,您可以使用它:

https://github.com/ahpoi/commons-utils-sdk/blob/master/src/main/java/com/ahpoi/commons/utils/aws/lambda/model/proxy/response/ResponseBuilder.java

public ResponseBuilder originHeader(String domain) {
    headers.put(ACCESS_CONTROL_ALLOW_ORIGIN, domain);
    return this;
}

private void initDefaultHeaders() {
    headers.put(ACCESS_CONTROL_ALLOW_HEADERS, "Content-Type");
}

public Response build() {
    this.initDefaultHeaders();
    return new Response(statusCode, headers, body);
}

如果您没有使用代理资源,您的配置已足够。

编辑了问题并根据您的评论进行了一些添加,但仍然没有效果。 - DevilCode
谢谢。我犯了一个错误,/auth没有设置为CORS,所以我猜之后的所有东西都不起作用了。感谢你的帮助。 - DevilCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接