Вы упомянули в своих комментариях, что с помощью почтальона вы можете получить ожидаемый ответ. Это хорошая отправная точка. Я подозреваю, что использование команды curl curl -i -X URL
из терминала также возвращает правильный ответ.
Если почтальон работает правильно, вы должны знать, что прямо перед выполнением запроса angular отправляет другой запрос, называемый pre-flight запросом, который выполняет минимальную проверку конечной точки на стороне сервера.
Это запрос типа OPTIONS.
Во-первых, вы должны убедиться, что ваш dispatcherServlet принимает запросы OPTIONS. Вы можете добиться этого либо указав его в файле конфигурации *.properties
, например:
spring.mvc.dispatch-options-request=true
или настроив web.xml
<servlet>
<!--content eluded for clarity-->
<init-param>
<param-name>dispatchOptionsRequest</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
После того, как вы настроили его для приема запросов OPTIONS, создайте Filter.java
и настройте фильтр CORS.
Вы можете руководствоваться следующим примером:
public class CorsFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
if(response instanceof HttpServletResponse){
HttpServletResponse alteredResponse = ((HttpServletResponse)response);
addCorsHeader(alteredResponse);
}
filterChain.doFilter(request, response);
}
private void addCorsHeader(HttpServletResponse response){
//TODO: externalize the Allow-Origin
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD");
response.addHeader("Access-Control-Allow-Headers", "Authorization, X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
response.addHeader("Access-Control-Max-Age", "1728000");
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig filterConfig)throws ServletException{}
}
В конце не забудьте добавить этот фильтр в web.xml
вместе со следующими параметрами инициализации.
<filter>
<filter-name>cors-filter</filter-name>
<filter-class>ai.surge.usrmngmtservice.util.cors.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Authorization,Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<!--<init-param>-->
<!--<param-name>cors.preflight.maxage</param-name>-->
<!--<param-value>1800</param-value>-->
<!--</init-param>-->
</filter>
Вы должны быть готовы идти сейчас.
person
flashjpr
schedule
14.02.2017
GLOBALS.mismatchUrl
? Я полагаю, что он не говорит «Неверный URL-адрес» без всякой причины... - person Brother Woodrow   schedule 14.02.2017