当前位置: 首页 > 知识库问答 >
问题:

HTTP标头中的Set-Cookie被AngularJS忽略

楚鸿波
2023-03-14

我正在开发一个客户端基于AngularJS的应用程序,服务器端基于我的API(Tomcat+Jersey for WS)的Java。

我的API的某些路径受到限制,如果用户没有会话,则返回的响应状态为401。在客户端,拦截401个http状态以将用户重定向到登录页面。

用户通过身份验证后,我将在服务器端创建一个会话

httpRequest.getSession(true);

null

Set-Cookie:JSESSIONID=XXXXXXXXXXXXXXXXXXXXX; Domain=localhost; Path=/api/; HttpOnly

问题是cookie从不放在客户端。当我检查localhost域的cookie时,它是空的,所以下一个请求的头中没有这个cookie,客户端仍然无法访问我的API的受限路径。

客户端和服务器位于同一域中,但它们不具有相同的路径和相同的端口号:

客户端:http://localhost:8000/app/index.html

服务器:http://localhost:8080/api/restricted/

附加信息:CORS在两侧均启用:

"Access-Control-Allow-Methods", "GET, POST, OPTIONS"
"Access-Control-Allow-Origin", "*"
"Access-Control-Allow-Credentials", true

有什么办法可以让Set-cookie正常工作吗?是AngularJS相关的问题吗?

共有3个答案

司马狐若
2023-03-14

在客户端的post请求中,确保添加以下内容:

对于jquery ajax请求:

null

$.ajax({
  url: "http://yoururlgoeshere",
  type: "post",
  data: "somedata",
  xhrFields: {
    withCredentials: true
  }
});
邢小云
2023-03-14

我解决了一个和你很相似的问题。我的戏!后端试图设置一个会话Cookie,但我无法在Angular中捕获或通过浏览器存储

实际上,解决方案包含了这一点和那一点。

假设您已经解决了最初的问题,这个问题只能通过向Access-Control-Allow-Origin添加特定域并删除通配符来解决,接下来的步骤是:

>

  • 您必须从set-cookie头中删除HTTP-Only,否则您将永远无法接收由您的angular代码“生成”的cookie
    此设置已在Firefox中运行,但在Chrome中不行

    要使它也适用于Chrome,您需要:

    a)从cookie中的localhost发送不同的域,使用您的WS“托管”的域。您甚至可以使用诸如.domain.com之类的通配符,而不是WS.domain.com

    b)然后您需要调用您在cookie中指定的域,否则Chrome不会存储您的cookie

    [可选]我将删除/API路径,以支持/


    这应该是诀窍。
    希望对你有所帮助

  • 西门鹏程
    2023-03-14

    我在AngularJS中发现了一个问题,帮助我向前迈进。

    客户端似乎未设置“access-control-allow-credentials”:true。已忽略指令$HttpProvider.Defaults.WithCredentials=true

    我将$Resource调用替换为一个简单的$HTTP调用,在config参数中使用{WithCredentials:true}。

     类似资料:
    • 很好的一天! 我的应用程序使用简单的http客户端-服务器通信,通过客户端的凌空库建立。首先,我启动一个授权请求: 之后,我请求列出与当前用户相关的设备列表。此时,我收到了来自响应标题的cookei。auth请求的完整标头响应输出: 缓存控制——没有存储,没有缓存,必须重新验证,后检查=0,预检查=0 在身份验证请求的onResponce回调中,我将Set Cookie值作为sessionId,并

    • 问题内容: 我有一个带有Passport模块的Node.js Express REST API,用于身份验证。登录方法(GET)在标题中返回cookie。当我从Chrome调用它时,它工作正常,我的Cookie已在浏览器中设置。 但是,如果我通过Angularjs中的$ http调用它,则不会设置cookie。 如您在上面所看到的,Set-Cookie位于http服务响应的标题中。 也许HttpO

    • 问题内容: 我有一个带有多个控制器的webapp。我在一个控制器中(通过)在回调中设置服务的默认标头。但是,这些标头不会在其他控制器的后续调用中设置。是否必须为我拥有的每个控制器设置一次,或者一次设置足够? 问题答案: 您应该使用以下两种方法之一: 在运行块中设置$ http.defaults.headers 使用拦截器

    • 我有一个PHP脚本,它成功地返回一些简单的头以及一个set-cookie头,如果在浏览器中直接调用(或由邮递员)。我可以从chrome DevTools上读到这样的响应标题。但是当我用Axios调用它时,set-cookie头就不会显示出来,浏览器中也没有保存cookie。 我尝试了不同的方法,比如在服务器端更改响应头,并在axios中使用“with Credentials:true”,但都不起作

    • 所述Set-CookieHTTP 响应报头被用于从服务器向用户代理发送 cookie。 有关更多信息,请参阅 HTTP cookie 指南。 Header type Response header Forbidden header name no 句法 Set-Cookie: <cookie-name>=<cookie-value> Set-Cookie: <cookie-name>=<cooki

    • 问题内容: 我需要从服务器发送的HTTP响应中获取cookie,并将其放在下一个请求的标头中。我该怎么做? 提前致谢。 问题答案: 您应该将cookielib模块与urllib一起使用。 它将在请求之间存储cookie,您可以将它们加载/保存在磁盘上。这是一个例子: 请注意,请求之间的和值相同。如果省略,则它们将有所不同(urllib2不会在第二个请求上发送标头)。