Я рвал на себе волосы по этому вопросу. Я пытаюсь включить CORS между приложением Angular и сервером Джерси. В основном я реализовал фильтр для трикотажа, который должен разрешать угловой доступ к серверу:
public class SimpleCORSFilter implements ContainerResponseFilter {
/**
* Add the cross domain data to the output if needed
*
* @param creq The container request (input)
* @param cres The container request (output)
* @return The output request with cross domain if needed
*/
@Override
public ContainerResponse filter(ContainerRequest creq, ContainerResponse cres) {
cres.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
cres.getHttpHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
cres.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
cres.getHttpHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
cres.getHttpHeaders().add("Access-Control-Max-Age", "1209600");
return cres;
}
}
Затем я добавил это как параметр инициализации в свой файл web.xml.
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>com.complaints.security.SimpleCORSFilter</param-value>
</init-param>
Когда я нажимаю URL-адрес - mysite:8080/ComplaintService/service/user/authenticate от почтальона с сообщением, содержащим сведения о пользователе, он возвращается нормально (как и ожидается от почтальона), а заголовок содержит все правильные заголовки, связанные с CORS. Когда я пытаюсь сделать вызов из angular, по какой-то причине ни один из заголовков CORS не возвращается, и это не удается. Даже если я просто нажму URL-адрес из браузера как GET, заголовки CORS будут возвращены. Это мой угловой вызов:
$http.post('http://mysite:8080/ComplaintService/service/user/authenticate', user).then(function(data) {
alert(JSON.stringify(data));
});
В основном мне просто интересно, я упускаю что-то простое? Или, возможно, это может быть связано с пружинным защитным фильтром? Я думал, что приложение потенциально может быть заблокировано от доступа к фильтру трикотажа. Вот пружинный фильтр:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
В настоящее время Angular развернут на майке — mysite: 8081, а сервер развернут на mysite: 8080. Любая помощь будет принята с благодарностью!