Spark跨域资源共享(CORS)Access-control-allow-origin错误

3
我正在使用Java和Angular 1作为客户端使用Spark。但是,当我向服务器发送请求时,我一直收到"-1"错误。错误信息为:“在请求的资源上不存在'Access-control-allow-origin'标头。因此,不允许访问来源'http://localhost:4567'。”。
我知道这是CORS问题,所以我添加了头文件“Access-Control-Allow-Origin':'*”,并在服务器响应中也添加了它。但不幸的是,这似乎没有解决我的问题。
希望你们能帮帮我,谢谢!

1
我刚刚尝试了一下将 Access-Control-Allow-Origin 设置为 *,效果很好。你能展示一些代码吗? - Yevgeniy
当然,我使用了这里的示例 https://sparktutorials.github.io/2016/05/01/cors.html。客户端需要做出任何更改吗? - Tom Dinur
你可能想尝试这个 https://dev59.com/04jca4cB1Zd3GeqP2df0#33736267 - Laercio Metzner
2个回答

8

Spark.after() 是你的好帮手

package com.company.package;

import static spark.Spark.*;

import com.google.gson.Gson;
import spark.Filter;
import spark.Request;
import spark.Response;

public class MyClass {

    public static void main(String[] args) {
        final Service service = new ServiceImpl();

        after((Filter) (request, response) -> {
            response.header("Access-Control-Allow-Origin", "*");
            response.header("Access-Control-Allow-Methods", "GET");
        });

        get( "/something", (req, res)->{
            res.type("application/json");
            return new Gson().toJsonTree(service.getNodes());
        });
    }
}

4

我成功地使用了以下内容(我在这里找到的:https://gist.github.com/zikani03/7c82b34fbbc9a6187e9a):

//add correct package 

import com.mpaw.app.controllers.Apply;
import java.util.HashMap;
import spark.Filter;
import spark.Request;
import spark.Response;
import spark.Spark;

/**
 * Really simple helper for enabling CORS in a spark application;
 */
public class CorsFilter /*implements Apply*/{

    private final HashMap<String, String> corsHeaders = new HashMap<>();

    public CorsFilter() {
        corsHeaders.put("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
        corsHeaders.put("Access-Control-Allow-Origin", "*");
        corsHeaders.put("Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin,");
        corsHeaders.put("Access-Control-Allow-Credentials", "true");
    }

    @Override
    public void apply() {
        Filter filter = new Filter() {
            @Override
            public void handle(Request request, Response response) throws Exception {
                corsHeaders.forEach((key, value) -> {
                    response.header(key, value);
                });
            }
        };
        Spark.after(filter);
    }
}

使用方法:

public static void main(String[] args) {
    CorsFilter.apply(); // Call this before mapping thy routes
    Spark.get("/hello", (request, response) -> {
        return "Hello";
    });
}

如果您设置了自定义端口,必须在调用CorsFilter.apply()之前完成。 - Antoine Dahan
@toinetoine 为什么在设置自定义端口之前而不是之后?有什么区别吗? - redigaffi

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