请教一个取session的问题(好像是跨域我也不知道是不是没遇到过)

时间:2021-10-05 19:15:37
api.com有login和getUser方法

我localhost.com请求api/login(登陆成功保存USERID到session里)
然后我再请求api/getUser    在getUser里面我获取之前登陆保存的seesion等于NULL为什么(我已经登陆过了)

16 个解决方案

#1


没人吗  是请求的WEB API中SESSION   自己来顶个层

#2


session里可以保存user对象,不限于某个值,对象在会话过程中常被用到,你不可能每次都去数据库拿吧

#3


session只能在一次会话中使用,你网站关闭,session就会被注销,建议你使用cookie

#4


这不是跨域,session是对话状态,你如果只是访问一次,然后没有任何页面持久化那个域名的页面,那么对话就失效了,再打开就是新的页面,当然这种也跟你的浏览器有关

#5


另外,这本身也具有跨域问题,你可以查下p3p协议

#6


引用 5 楼 starfd 的回复:
另外,这本身也具有跨域问题,你可以查下p3p协议


大神  新手不知道怎么处理这种问题  能给个解决方案吗?   应为是WEBAPI保存的SESSION 怎么样保存持久化了? 保持SESSION会话不会消失?

#7


引用 4 楼 starfd 的回复:
这不是跨域,session是对话状态,你如果只是访问一次,然后没有任何页面持久化那个域名的页面,那么对话就失效了,再打开就是新的页面,当然这种也跟你的浏览器有关



每次访问WEBAPI提供的方法是不是就是一次新的会话  所以SESSION消失了

#8


Web Api 本来就是无状态的, 都是基于token来请求的

#9


首先搞懂SESSION是什么。。就是客户端COOKIES加服务器端的缓存。。

如果你访问一个接口(A),A中将userid保存到SESSION中(Session[userid]="AAA")。。这时服务器做了什么?

首先Session的数据结构大概是这样的

Dictionary<string,Dictionary<string,object>> session_struct;

1.生成一个唯一标识如:qweasdzxc1234
2.往session_struct中插入key为qweasdzxc1234,value为新是实例化的一个Dictionary<string,object> 我们暂且称为value_struct
3.将value_struct中插入key=userid value="AAA",操作完成
4.将生成的唯一标识(qweasdzxc1234),添加Cookies到响应头中(我看过了,Cookie的名字都叫ASP.NET_SessionId)
5.客户端收到响应后写入Cookie

所以下次请求的时候,你通过Session去获取时,其实它会去请求头的cookies中寻找这个标识,找到对应的value_struct,然后找到你要的信息。

很明显,你如果用程序去调这个WebApi(HttpWebRequest),很明显没带Cookie。。当然为空。。

#10


这个问题的根本就是,你的WebApi设计得有问题。。

现在都是通过数字签名的方式去做的了。

如果你确定要用Session。。那么我可以肯定的是。调用api.com中的login接口在响应头的Cookie中一定有一个交ASP.NET_SessionId的东西。。你去调getUser接口时把它带上就可以了

#11


引用 10 楼 lyj224170707 的回复:
这个问题的根本就是,你的WebApi设计得有问题。。

现在都是通过数字签名的方式去做的了。

如果你确定要用Session。。那么我可以肯定的是。调用api.com中的login接口在响应头的Cookie中一定有一个交ASP.NET_SessionId的东西。。你去调getUser接口时把它带上就可以了


还是不太明白如果SESSION在login中有保存,并且他叫userId 和一个qweasdzxc1234为什么不能在getUser请求的时候在服务端直接拿到叫userId的SESSION   而要通过login返回的qweasdzxc1234ID在前段拿到再通过请求发送到服务端再通过传过去的去寻找呢?

#12


 。    这不科学    

#13


引用 11 楼 qq_26490313 的回复:
Quote: 引用 10 楼 lyj224170707 的回复:

这个问题的根本就是,你的WebApi设计得有问题。。

现在都是通过数字签名的方式去做的了。

如果你确定要用Session。。那么我可以肯定的是。调用api.com中的login接口在响应头的Cookie中一定有一个交ASP.NET_SessionId的东西。。你去调getUser接口时把它带上就可以了


还是不太明白如果SESSION在login中有保存,并且他叫userId 和一个qweasdzxc1234为什么不能在getUser请求的时候在服务端直接拿到叫userId的SESSION   而要通过login返回的qweasdzxc1234ID在前段拿到再通过请求发送到服务端再通过传过去的去寻找呢?


如果直接通过userId拿。你怎么区别不同的人呢?不区别人,怎么叫做会话呢?

#14


qweasdzxc1234 相当于一个会话标识,只有拿着这个表示过来,我服务器才知道你是谁。

不然我有N个用户,都存了session都存了userid。。我请求服务器的时候,我如何分辨你到底是谁?你存的userid到底是哪一个

#15


1.)session相当于‘银行'

2.)ASP.NET_SessionId(会话ID)相当于一张‘银行卡’,这个是唯一的。

3.)session["活期"]=123。相当你拿着银行卡(ASP.NET_SessionId),去银行告诉柜台我要给‘活期’存入123块钱。。

4.)你这种情况属于没有ASP.NET_SessionId(会话ID),然后去服务器取数据。就相当于你没有银行卡,然后跑去银行说我要在‘活期’取钱123块。。人家鬼知道你银行卡是多少。又不是你一个人有‘活期’账户。

5.)ASP.NET_SessionId(会话ID)是保存在客户端Cookie的,所以平时写代码在网站运行时正常。那是因为你服务器在给session赋值时做了这一切,并且把会话ID放在响应头的cookie里头,游览器接收到响应后自然就写入到游览器Cookie里头了。下次请求时自然就知道你是谁了。
你webapi去调登录,你不存这个会话ID。然后去getUser。鬼知道你是谁?


总结就是基础不到位。

#16


引用 15 楼 lyj224170707 的回复:
1.)session相当于‘银行'

2.)ASP.NET_SessionId(会话ID)相当于一张‘银行卡’,这个是唯一的。

3.)session["活期"]=123。相当你拿着银行卡(ASP.NET_SessionId),去银行告诉柜台我要给‘活期’存入123块钱。。

4.)你这种情况属于没有ASP.NET_SessionId(会话ID),然后去服务器取数据。就相当于你没有银行卡,然后跑去银行说我要在‘活期’取钱123块。。人家鬼知道你银行卡是多少。又不是你一个人有‘活期’账户。

5.)ASP.NET_SessionId(会话ID)是保存在客户端Cookie的,所以平时写代码在网站运行时正常。那是因为你服务器在给session赋值时做了这一切,并且把会话ID放在响应头的cookie里头,游览器接收到响应后自然就写入到游览器Cookie里头了。下次请求时自然就知道你是谁了。
你webapi去调登录,你不存这个会话ID。然后去getUser。鬼知道你是谁?


总结就是基础不到位。

好的  谢谢   已经想办法解决的个问题了       谢谢大佬给我涨知识    

#1


没人吗  是请求的WEB API中SESSION   自己来顶个层

#2


session里可以保存user对象,不限于某个值,对象在会话过程中常被用到,你不可能每次都去数据库拿吧

#3


session只能在一次会话中使用,你网站关闭,session就会被注销,建议你使用cookie

#4


这不是跨域,session是对话状态,你如果只是访问一次,然后没有任何页面持久化那个域名的页面,那么对话就失效了,再打开就是新的页面,当然这种也跟你的浏览器有关

#5


另外,这本身也具有跨域问题,你可以查下p3p协议

#6


引用 5 楼 starfd 的回复:
另外,这本身也具有跨域问题,你可以查下p3p协议


大神  新手不知道怎么处理这种问题  能给个解决方案吗?   应为是WEBAPI保存的SESSION 怎么样保存持久化了? 保持SESSION会话不会消失?

#7


引用 4 楼 starfd 的回复:
这不是跨域,session是对话状态,你如果只是访问一次,然后没有任何页面持久化那个域名的页面,那么对话就失效了,再打开就是新的页面,当然这种也跟你的浏览器有关



每次访问WEBAPI提供的方法是不是就是一次新的会话  所以SESSION消失了

#8


Web Api 本来就是无状态的, 都是基于token来请求的

#9


首先搞懂SESSION是什么。。就是客户端COOKIES加服务器端的缓存。。

如果你访问一个接口(A),A中将userid保存到SESSION中(Session[userid]="AAA")。。这时服务器做了什么?

首先Session的数据结构大概是这样的

Dictionary<string,Dictionary<string,object>> session_struct;

1.生成一个唯一标识如:qweasdzxc1234
2.往session_struct中插入key为qweasdzxc1234,value为新是实例化的一个Dictionary<string,object> 我们暂且称为value_struct
3.将value_struct中插入key=userid value="AAA",操作完成
4.将生成的唯一标识(qweasdzxc1234),添加Cookies到响应头中(我看过了,Cookie的名字都叫ASP.NET_SessionId)
5.客户端收到响应后写入Cookie

所以下次请求的时候,你通过Session去获取时,其实它会去请求头的cookies中寻找这个标识,找到对应的value_struct,然后找到你要的信息。

很明显,你如果用程序去调这个WebApi(HttpWebRequest),很明显没带Cookie。。当然为空。。

#10


这个问题的根本就是,你的WebApi设计得有问题。。

现在都是通过数字签名的方式去做的了。

如果你确定要用Session。。那么我可以肯定的是。调用api.com中的login接口在响应头的Cookie中一定有一个交ASP.NET_SessionId的东西。。你去调getUser接口时把它带上就可以了

#11


引用 10 楼 lyj224170707 的回复:
这个问题的根本就是,你的WebApi设计得有问题。。

现在都是通过数字签名的方式去做的了。

如果你确定要用Session。。那么我可以肯定的是。调用api.com中的login接口在响应头的Cookie中一定有一个交ASP.NET_SessionId的东西。。你去调getUser接口时把它带上就可以了


还是不太明白如果SESSION在login中有保存,并且他叫userId 和一个qweasdzxc1234为什么不能在getUser请求的时候在服务端直接拿到叫userId的SESSION   而要通过login返回的qweasdzxc1234ID在前段拿到再通过请求发送到服务端再通过传过去的去寻找呢?

#12


 。    这不科学    

#13


引用 11 楼 qq_26490313 的回复:
Quote: 引用 10 楼 lyj224170707 的回复:

这个问题的根本就是,你的WebApi设计得有问题。。

现在都是通过数字签名的方式去做的了。

如果你确定要用Session。。那么我可以肯定的是。调用api.com中的login接口在响应头的Cookie中一定有一个交ASP.NET_SessionId的东西。。你去调getUser接口时把它带上就可以了


还是不太明白如果SESSION在login中有保存,并且他叫userId 和一个qweasdzxc1234为什么不能在getUser请求的时候在服务端直接拿到叫userId的SESSION   而要通过login返回的qweasdzxc1234ID在前段拿到再通过请求发送到服务端再通过传过去的去寻找呢?


如果直接通过userId拿。你怎么区别不同的人呢?不区别人,怎么叫做会话呢?

#14


qweasdzxc1234 相当于一个会话标识,只有拿着这个表示过来,我服务器才知道你是谁。

不然我有N个用户,都存了session都存了userid。。我请求服务器的时候,我如何分辨你到底是谁?你存的userid到底是哪一个

#15


1.)session相当于‘银行'

2.)ASP.NET_SessionId(会话ID)相当于一张‘银行卡’,这个是唯一的。

3.)session["活期"]=123。相当你拿着银行卡(ASP.NET_SessionId),去银行告诉柜台我要给‘活期’存入123块钱。。

4.)你这种情况属于没有ASP.NET_SessionId(会话ID),然后去服务器取数据。就相当于你没有银行卡,然后跑去银行说我要在‘活期’取钱123块。。人家鬼知道你银行卡是多少。又不是你一个人有‘活期’账户。

5.)ASP.NET_SessionId(会话ID)是保存在客户端Cookie的,所以平时写代码在网站运行时正常。那是因为你服务器在给session赋值时做了这一切,并且把会话ID放在响应头的cookie里头,游览器接收到响应后自然就写入到游览器Cookie里头了。下次请求时自然就知道你是谁了。
你webapi去调登录,你不存这个会话ID。然后去getUser。鬼知道你是谁?


总结就是基础不到位。

#16


引用 15 楼 lyj224170707 的回复:
1.)session相当于‘银行'

2.)ASP.NET_SessionId(会话ID)相当于一张‘银行卡’,这个是唯一的。

3.)session["活期"]=123。相当你拿着银行卡(ASP.NET_SessionId),去银行告诉柜台我要给‘活期’存入123块钱。。

4.)你这种情况属于没有ASP.NET_SessionId(会话ID),然后去服务器取数据。就相当于你没有银行卡,然后跑去银行说我要在‘活期’取钱123块。。人家鬼知道你银行卡是多少。又不是你一个人有‘活期’账户。

5.)ASP.NET_SessionId(会话ID)是保存在客户端Cookie的,所以平时写代码在网站运行时正常。那是因为你服务器在给session赋值时做了这一切,并且把会话ID放在响应头的cookie里头,游览器接收到响应后自然就写入到游览器Cookie里头了。下次请求时自然就知道你是谁了。
你webapi去调登录,你不存这个会话ID。然后去getUser。鬼知道你是谁?


总结就是基础不到位。

好的  谢谢   已经想办法解决的个问题了       谢谢大佬给我涨知识