AngularJS:未发送X-Auth-Token(错误401)

时间:2014-07-17 21:22:53

标签: spring angularjs cors

我在这里是因为我尝试了一切,我不明白我做错了什么。

作为后端,我使用Spring MVC,Rest和Spring Security。我正在使用基于令牌的自定义身份验证系统(完全无状态)。我还有一个CORS的过滤器,因为我的前端应用程序没有在同一台服务器上运行。

所以这就是我在angularJS中所做的,以便在我想访问受保护资源时获得身份验证:

  • 我创建了一个拦截器来更改每个添加从cookie中找到的令牌的请求
  • 我在请求中添加了自定义标题

这是我的拦截器所做的:

request: function(config) {
            var token = $cookieStore.get("token");
            if (token && token.key) {

                config.headers["X-Auth-Token"]=token.key;

            }
            console.log(config.headers);

            return  config || $q.when(config);
        }

但是当我尝试访问受保护资源时,即使令牌仍然有效,它也永远不会在请求中放置X-Auth-Token标头!它试图发送选项的请求,但因401错误而失败!

但是如果我对url参数(如token = ....)执行相同操作,则拦截器按预期工作...(我已经实现了两个系统:by参数和标头)

我不明白为什么标题没有按预期放置?以及为什么它与像POSTMAN这样的东西完美配合?

请帮助,我正在失去我的头发......

3 个答案:

答案 0 :(得分:1)

我通过改变我的过滤器修复了这个问题:

public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)抛出IOException,ServletException {         HttpServletRequest request =(HttpServletRequest)req;         LOG.info("进入过滤器");

    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET,  DELETE, PUT");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Origin, Authorization, X-Auth-Token");
    response.addHeader("Access-Control-Expose-Headers", "X-Auth-Token");
    if (request.getMethod().equals("OPTIONS")) {
        try {
            response.getWriter().print("OK");
            response.getWriter().flush();
        } catch (IOException e) {
            LOG.error(e.getMessage());
        }
    } else {
        chain.doFilter(request, response);
    }

}

答案 1 :(得分:1)

这样做可能更干净,而不是你接受的答案。

if (request.getMethod().equals("OPTIONS")) {
    response.setStatus(HttpServletResponse.SC_OK);
} else {
    chain.doFilter(request, response);
}

答案 2 :(得分:0)

不确定这是否会解决您的问题,但$ cookieStore只能获取/设置字符串,因此以下内容:

var token = $cookieStore.get("token");
        if (token && token.key) {

永远不会评估为真。