CORS预检请求 - 标题中的自定义身份验证令牌 - Spring和Angular 4

时间:2017-11-10 16:46:17

标签: spring angular cors jwt

我在使用令牌作为标头的本地服务器上请求简单GET时遇到问题。 我的浏览器继续在简单的GET请求上发送预检请求。

我尝试过postman / curl,我没有任何问题。

这是实际的代码: 服务器(Spring):

@Override
public void doFilter(final ServletRequest req, final ServletResponse res,
                     final FilterChain chain) throws IOException, ServletException {
    final HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods",
            "POST, GET, PUT, OPTIONS, DELETE, PATCH");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with, x-auth-token, Content-Type");
    response.setHeader("Access-Control-Expose-Headers", "x-auth-token");
    response.setHeader("Access-Control-Allow-Credentials", "true");

    final HttpServletRequest request = (HttpServletRequest) req;

    if (request.getMethod().equals("OPTIONS")) {
        try {
            response.getWriter().print("OK");
            response.getWriter().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        chain.doFilter(request, response);
    }
}

所以我的x-auth-token这里是一个类似jwt的令牌。

在我的Angular代码中,我只需将我的令牌添加为x-auth-token,如下所示:

getAll() {
    return this.http.get('http://127.0.0.1:8080/module', this.jwt()).map((response: Response) => response.json());
}

private jwt() {
    // create authorization header with jwt token
    let token = localStorage.getItem('user');
    let obj = JSON.parse(token)
    console.log(obj.token.token)
    if (obj.token) {
        let headers = new Headers({
            'x-auth-token': obj.token.token,
            'Content-Type': "application/json"
        });
        return new RequestOptions({ headers: headers });
    }
}

请注意,我的身份验证/注册路由工作正常,我只是在将x-auth-token标头传送到Spring服务器时遇到问题。

我的网络服务器都在本地运行:Spring 8080和Angular 8000.

非常感谢任何帮助,

谢谢,

1 个答案:

答案 0 :(得分:1)

首先,postman和curl不是测试CORS的好方法,因为他们不会像标准浏览器那样执行相同的源策略。即使在浏览器中失败的情况下,它们也能正常工作。

其次,由于x-auth-token标头和application/json内容类型,浏览器预先通知您的请求的原因是它不是simple request。只有1个}} application/x-www-form-urlencoded和multipart/form-data个内容类型。

我认为问题出在OPTION响应中。确保它包含所有相关标头。它可能是失败的,或者您正在丢失添加的标题,因为您处理它的方式与其他响应不同。