簡體   English   中英

Java - Access-Control-Allow-Origin 多源域?

[英]Java - Access-Control-Allow-Origin Multiple Origin Domains?

因此,我已經閱讀了有關此問題的其他線程,但尚未找到解決方案。

我遇到的問題是因為我設置了“access-control-allow-methods”“true”我不能使用setHeader("Access-Control-Allow-Origin", "*");

我需要設置兩個特定的域...任何幫助表示贊賞。

public class CorsInterceptor implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {
        //Cuando se envia la cookie http-only el header 'Access-Control-Allow-Origin' no puede ser *
        responseContext.getHeaders().putSingle("Access-Control-Allow-Origin", requestContext.getHeaderString("origin"));
    }
}

您可以做的是將您的 http 方法修改為:

 public Response getYourMethod( HttpServletRequest request) 
                             throws Exception, IOException{
  //then your code
 }

現在之后添加以下內容:

由於您的 API 在 Allow Origin Header 中查找www.yoursite.com:3000 ,您需要確保將其添加到以下行中:

response.setHeader("Access-Control-Allow-Origin", "www.yoursite.com:3000");

要獲取www.yoursite.com:3000您可以使用:

String requestUrl = request.getRemoteAddr() + ":" + request.getRemotePort();

但是,如果瀏覽器查找 localhost,則查找:

request.getRemoteHost().

所以你基本上可以有這樣的東西:

if (requestUrl.equals(yourAPIURL)){
   //allow access
    response.setHeader("Access-Control-Allow-Origin", requestUrl);
}

避免添加*因為某些瀏覽器和 API 仍然不允許這樣做,並且如果您使用的是瀏覽器,則可能會被預檢請求拒絕。

確保按照帖子中的說明正確添加標題和方法。

希望能解決您的問題。

你可以這樣做:

private static final String URL = "http://somehost:port"; // URL
private static final String OTHER_URL = "http://otherhost:port"; // OTHER URL  

private void setAccessControlAllowOrigin(HttpServletResponse response,
     HttpServletRequest request) {
    if (URL.equals(request.getHeader("Origin"))) {
        response.setHeader("Access-Control-Allow-Origin", URL);
    } else if (OTHER_URL.equals(request.getHeader("Origin"))) {
        response.setHeader("Access-Control-Allow-Origin", OTHER_URL);
    }
}

這是我只允許特定來源的方法

  1. .properties文件中定義一個屬性來獲取允許 origins 的值如下
#CORS Settings
cors.origins.allowed=https://127.0.0.1:5500, http://127.0.0.1:5000

實現一個過濾器類,我們可以在其中修改響應允許源頭

private String setAllowedOrigin(HttpServletRequest request) {
        String requestOrigin = request.getHeader("origin");
        log.info("Request is received with origin header : {}", requestOrigin);
        List<String> originsList = Arrays.stream(this.origins.split(","))
                .map(String::trim).filter(origin -> !origin.equals("")).collect(Collectors.toList());
        log.info("origins List : {}", originsList);
        if (!originsList.isEmpty() && requestOrigin != null) {
            Optional<String> origin = originsList.stream().filter(allowedOrigin -> allowedOrigin.equals(requestOrigin)).findFirst();
            return origin.orElseGet(() -> originsList.get(0));
        }
        return "*";
    }


 @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", setAllowedOrigin(request));
       
        chain.doFilter(req, res);
    }

此 CORS 過濾器僅允許屬性文件中提到的來源為了說明行為,我使用 Visual Studio 代碼實時服務器和以下代碼我的 API 中有一個test端點。

<!DOCTYPE html>
<html>

<head>
    <title></title>
</head>

<body>
    <Script>
        fetch("http://localhost:8080/test", { method: "get" })
            .then(res => res.json())
            .then(data => console.log(data));
    </Script>
</body>

</html>

當我點擊實時服務器時的示例圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM