浏览器不发送Cookie

前几天写了个小项目,本地跑的好好的,部署到服务器上也正常。最近在服务器上跑,出幺蛾子了。程序突然报错,本应该从httpServletRequest.getSession()中写入和读出的,但是却读不出,结果为null。开启远程调式,发现程序确实读取不到httpServletRequest.getSession()中的值。
在这里插入图片描述
会到本地计算机重新跑程序,程序正常,debug发现同样的值在本地跑可以获取到。在这里插入图片描述
以为是打包jar出问题了,就重新编译打包,并且现在本地计算机上运行jar包。同样显示正常,再次部署到服务器。见鬼了,服务器还是不行,程序读取不到session中的值。既然本地的jar可以正常运行,那么jar打包应该正确。session是依靠cookie的,会不会是跨域的问题?

但是程序中已经标注了allowCredentials = “true”,在前端代码中也设置了xhrFields:{withCredentials:true}要求携带cookie发送请求。

查看程序在本地时cookie情况:
在这里插入图片描述
第一次响应是返回cookie的,tomcat的sessionID叫JSESSIONID。在这里插入图片描述
第二次请求携带了cookie。

查看程序在服务器上的运行:
第一次请求没有Cookie
在这里插入图片描述
第一次请求服务器同样返回Cookie
在这里插入图片描述
但是在随后的请求中,浏览器并没有将服务器给的Cookie携带发送。和第一次请求一摸一样。问题找到了,浏览器没有发送Cookie,导致随后的操作,服务器不知道之前的状态,读取不到对应的参数。导致报错。
在这里插入图片描述
问题分析:但是相同的代码,同样的浏览器,为社么在本地计算机就可以发送Cookie,但是在云服务器上就不发送。这里就和后端代码和前端没有关系了,一定是浏览器本身的设置问题。

原来是从Chrome51开始,增加了SameSite属性。详细请看SameSite

简单的说就是SameSite属性,分为3类。Strict、Lax和None。以前发送Cookie是服务器设置allowCredentials:true以及前端代码中设置withCredentials:true。但是现在即使都设置了,SameSite不对也不会发送。

1、Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。

2、Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外

3、Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效

解决办法就是设置成None模式,这样Cookie通过Https发送。
在Microsoft Edge中打开属性,在目标(T)后面增加

 --disable-features=SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure

即可。注意是在”“外面加哦。
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种高级编程语言,Delphi提供了一个强大的组件库,包括DelphiNet的HTTP客户端组件。DelphiNet HTTP客户端组件可以用于与服务器进行HTTP通信,从而实现向服务器发送请求并接收响应的功能。 要想调用浏览器cookie,我们可以使用DelphiNet HTTP客户端组件中的CookieManager属性。通过设置CookieManager属性,我们可以指定使用特定的浏览器cookie来进行HTTP请求。 首先,我们需要首先获取用户浏览器中的cookie。可以使用TWebBrowser组件在Delphi应用程序中加载一个网页,并通过读取其Cookie属性来获取浏览器cookie。例如,我们可以使用以下代码来获取Internet Explorer浏览器cookie: ```Delphi var Browser: TWebBrowser; Document: IHTMLDocument2; Cookie: string; begin Browser := TWebBrowser.Create(nil); try Browser.Navigate('about:blank'); while Browser.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages; Document := (Browser.Document as IHTMLDocument2); Cookie := Document.cookie; finally Browser.Free; end; end; ``` 获取到浏览器cookie后,我们可以将其设置到DelphiNet的HTTP客户端组件的CookieManager属性中,通过设置CookieManager的CookieCollection属性。例如,我们可以使用以下代码将获取到的cookie设置到DelphiNet的HTTP客户端组件上: ```Delphi var HttpClient: TIdHTTP; begin HttpClient := TIdHTTP.Create(nil); try HttpClient.CookieManager.CookieCollection.AddCookie('cookie_name=cookie_value', URL); finally HttpClient.Free; end; end; ``` 通过这样的设置,DelphiNet HTTP客户端组件将使用指定的浏览器cookie进行HTTP请求,实现了调用浏览器cookie的功能。 总结起来,要使用DelphiNet的HTTP客户端组件调用浏览器cookie,我们需要先获取浏览器cookie,然后将其设置到DelphiNet的HTTP客户端组件中,通过设置CookieManager的CookieCollection属性。这样,DelphiNet HTTP客户端组件将使用指定的浏览器cookie进行HTTP请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值