Liberty server.xml и настройки CORS
В WebSphere Liberty у меня есть серверная часть, которая работает по https://localhost:9443/context-root/objects. Это работает, и я могу проверить свои REST API из браузера или почтальона.
Я кодировал веб-интерфейс на Angular с помощью кода Visual Studio. Когда я пытаюсь протестировать ('> ng serve') с локальным хостом Crome:4200 с вызовами http пользовательского интерфейса REST API, я получаю ошибки:
server.xml без настроек CORS
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://localhost:4200' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
Заголовки ответа
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:origin, content-type, accept, authorization
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin:*
Access_Control_Max_Age:43200
Cache-Control:no-store, no-cache=set-cookie
Content-Length:284
Content-Type:application/json
server.xml с настройками CORS
<cors domain="/context-root" allowedOrigins="http://localhost:4200" allowedMethods="GET, DELETE, POST, PUT" allowedHeaders="accept" allowCredentials="true" maxAge="3600" />
Ошибка:
Failed to load https://localhost:9443/context-root/objects: The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:4200, *', but only one is allowed. Origin 'http://localhost:4200' is therefore not allowed access.
Заголовки ответа:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:origin, content-type, accept, authorization
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin:http://localhost:4200
Access-Control-Allow-Origin:*
Access_Control_Max_Age:43200
Я не уверен, почему я получаю двойные значения в заголовках ответа и почему, в частности, я получаю 2 allow-origin. Это можно обойти? Спасибо
1 ответ
Из приведенных выше комментариев к моему ответу пришло решение.
Был класс ContainerResponseFilter, который все время программно добавлял параметры CORS, независимо от того, были они установлены в server.xml или нет.
В результате каждый вызов API REST содержал их во всех ответах.
Я удалил класс фильтра, и это решило проблему. благодарю вас:-)
`
@Override
public void filter( ContainerRequestContext requestContext,
ContainerResponseContext responseContext )
throws IOException
{
final int ACCESS_CONTROL_MAX_AGE_IN_SECONDS = 12 * 60 * 60;
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add( "Access-Control-Allow-Credentials", "true" );
headers.add( "Access-Control-Allow-Headers",
"origin, content-type, accept, authorization" );
headers.add( "Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD" );
headers.add( "Access-Control-Allow-Origin", "*" );
headers.add( "Access_Control_Max_Age",
ACCESS_CONTROL_MAX_AGE_IN_SECONDS );
}
`