Включить настройки CORS на сервере Payara (или Glassfish) - PullRequest
0 голосов
/ 14 февраля 2019

Кто-нибудь знает, как включить CORS для определенных доменов на сервере Payara напрямую (или glassfish)?

Я работаю с сервером Payara 4.1.1.171.1.

У меня естьприложение, работающее на localhost: 3000, которое должно общаться с сервером Payara, но я продолжаю получать сообщение об ошибке CORS.

В большинстве ссылок, которые я нашел, говорится просто добавить домен (то есть localhost) в заголовок ответа, как таковой.:

response.addHeader ("Access-Control-Allow-Origin", "localhost");

, и я сделал это в своем коде Java, и это работает,Но я хочу знать, как обновить Payara (или Glassfish) на сервере напрямую, чтобы сделать это.Потому что я видел людей, делающих предложения, чтобы сделать именно это (то есть обновить файл конфигурации сервера, чтобы разрешить CORS для определенных доменов).Таким образом, java-код не должен был бы специально добавлять содержимое заголовка выше.

Но в этих предложениях были примеры для серверов, которые не являются Glassfish или Payara.

Даже по этой ссылке CORS https://enable -cors.org / server.html перечислены около 20 серверов / платформ о том, как включить CORS, но ни одна из них не является Payara или Glassfish.

Кто-нибудь знает, как это сделать?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Для более открытой фильтрации коров вы можете использовать следующее:

import java.io.IOException;
import java.util.List;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;


@Provider
public class CorsResponseFilter implements ContainerResponseFilter {

    public static final String ALLOWED_METHODS = "GET, POST, PUT, DELETE, OPTIONS, HEAD";
    public final static int MAX_AGE = 42 * 60 * 60;
    public final static String DEFAULT_ALLOWED_HEADERS = "origin,accept,content-type";
    public final static String DEFAULT_EXPOSED_HEADERS = "location,info";

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        final MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Headers", getRequestedAllowedHeaders(requestContext));
        headers.add("Access-Control-Expose-Headers", getRequestedExposedHeaders(requestContext));
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);
        headers.add("Access-Control-Max-Age", MAX_AGE);
        headers.add("x-responded-by", "cors-response-filter");
    }

    String getRequestedAllowedHeaders(ContainerRequestContext responseContext) {
        List<String> headers = responseContext.getHeaders().get("Access-Control-Allow-Headers");
        return createHeaderList(headers, DEFAULT_ALLOWED_HEADERS);
    }

    String getRequestedExposedHeaders(ContainerRequestContext responseContext) {
        List<String> headers = responseContext.getHeaders().get("Access-Control-Expose-Headers");
        return createHeaderList(headers, DEFAULT_EXPOSED_HEADERS);
    }

    String createHeaderList(List<String> headers, String defaultHeaders) {
        if (headers == null || headers.isEmpty()) {
            return defaultHeaders;
        }
        StringBuilder retVal = new StringBuilder();
        for (int i = 0; i < headers.size(); i++) {
            String header = (String) headers.get(i);
            retVal.append(header);
            retVal.append(',');
        }
        retVal.append(defaultHeaders);
        return retVal.toString();
    }

}

Из проекта cors Адама Бина на GitHub

0 голосов
/ 14 февраля 2019

Вам нужно создать перехватчик для каждого вызова, где вы должны добавить к нему больше заголовков.На некоторых условиях, которые вам нужны.Пожалуйста, посмотрите на код ниже:

import javax.ws.rs.HttpMethod;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;


@Provider
@PreMatching
public class CorsResponseFilter implements ContainerResponseFilter {

public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
            String origin = requestContext.getHeaderString("Origin");
            if ((origin != null) 
                    && origin.startsWith("http://localhost:4200") || origin.startsWith("http://localhost:8080"))) {
                allowExceptionCors(requestContext, responseContext, origin);
            } 
    }

    private void allowExceptionCors(ContainerRequestContext requestContext, ContainerResponseContext responseContext, String origin) {
        String methodHeader = requestContext.getHeaderString("Access-Control-Request-Method");
        String requestHeaders = requestContext.getHeaderString("Access-Control-Request-Headers");

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        headers.putSingle("Access-Control-Allow-Origin", origin);
        headers.putSingle("Access-Control-Allow-Credentials", "true");
        headers.putSingle("Access-Control-Allow-Methods", methodHeader);
        headers.putSingle("Access-Control-Allow-Headers", "x-requested-with," + (requestHeaders == null ? "" : requestHeaders));
    }
}
...