我正在开发一个客户端基于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相关的问题吗?
在客户端的post请求中,确保添加以下内容:
对于jquery ajax请求:
null
$.ajax({
url: "http://yoururlgoeshere",
type: "post",
data: "somedata",
xhrFields: {
withCredentials: true
}
});
我解决了一个和你很相似的问题。我的戏!后端试图设置一个会话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
路径,以支持/
这应该是诀窍。
希望对你有所帮助
我在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不会在第二个请求上发送标头)。