无法使用角度$ http发送授权标头以弹出后端

时间:2015-06-20 14:49:31

标签: angularjs spring spring-boot

我试图在我的应用程序的客户端使用$ http添加Authorization标头。

我使用nodejs为我的客户端应用程序提供服务,并使用spring boot为我的后端提供服务。

我已添加以下过滤器以启用CORS:

public class CorsFilter extends GenericFilterBean {
private static final Logger logger = Logger.getLogger(CorsFilter.class);
@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    logger.info("Enable cors filter");
    HttpServletResponse res = (HttpServletResponse) response;
    res.addHeader("Access-Control-Allow-Origin", "http://localhost:3000");
    res.addHeader("Access-Control-Allow-Credentials", "true");
    res.addHeader("Access-Control-Allow-Methods", "POST, GET, HEAD, OPTIONS");
    res.addHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization");
    chain.doFilter(request, response);

   }
}

我设置一个包含令牌的授权标头,其中包含以下行:

$http.defaults.headers.common.Authorization = 'Bearer ' + token;

然而angular似乎完全忽略了这个标题,当检查chrome中的请求时我看到了:

Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:accept, access-control-expose-headers, authorization
Access-Control-Request-Method:GET
Cache-Control:no-cache
Connection:keep-alive
Host:localhost:8080
Origin:http://localhost:3000
Pragma:no-cache
Referer:http://localhost:3000/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36

如果授权标题没有跟踪。

我已经添加了授权'在我的响应中的Access-Control-Allow-Headers标头中,CORS似乎正常运行,并且我已经设置了我的CORS过滤器屁股:

     @Bean
 public FilterRegistrationBean corsFilter() {
     final FilterRegistrationBean registrationBean = new FilterRegistrationBean();
     registrationBean.setFilter(new CorsFilter());
     registrationBean.addUrlPatterns("/*");
     registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);

     return registrationBean;
  }

所以它应该首先出现在所有网址模式上 那我错过了什么?

1 个答案:

答案 0 :(得分:1)

问题的解决方案在评论中,所以我在这里编辑了这些:

您在chrome中看到的请求是CORS访问请求。方法=选项。这是由浏览器而不是角度来完成的。你CORSFilter应该可以处理OPTION请求。

问题是由一个jwt过滤器引起的,它也是OPTION请求的预期授权标题。

如果方法不是OPTION,则通过添加条件来解决,只进行jwt验证。