我想知道会话特定于什么?这不限于一种语言。波纹管仅以php为例。
我使用php session,当我使用我的网站域名时效果很好。为了在Windows OS上的本地vmvare ubuntu中测试网站,我更改了Windows的主机以将DNS设置为本地ip。测试本地时,我使用域名,它也很好用。但是,当我在浏览器中将URL更改为Ip时,会话丢失了。
您可能会混淆为什么要这样做,因为我还要在我的android设备上测试该页面,因为如果没有android root,我将无法更改android设备的hosts文件,因此我必须使用ip。
您可能还会感到困惑,为什么我不能一直使用ip?因为我在Web应用程序中使用了第三个打开的登录名。第三个打开的登录桅杆使用域名作为重定向网址,因此当我登录时,它将以域名格式重定向到该网址。
为什么域名和IP的php会话相同?
为了确保PHP会话与域名和IP不相同?我也尝试了我的管理系统,上面是用户系统。
我也尝试使用我的管理系统,可以使用ip一直登录。但是,当我将ip更改为URL中的域名时,会话也会丢失。
由于您提到了PHP,因此我将提供PHP手册中的信息。我相信其他语言也有类似的表现。
在服务器中,会话特定于Cookie。从PHP手册:
会话ID通常通过会话Cookie发送到浏览器,并且该ID用于检索现有会话数据。缺少ID或会话cookie可使PHP知道创建新会话并生成新会话ID。
在用户代理(客户端,通常是浏览器)中,cookie特定于域和路径。根据RFC6265第4.1.2.3节:
域属性指定将向其发送Cookie的那些主机。例如,如果“域”属性的值为“ example.com”,则当对example.com,www.example.com和www.corp.example进行HTTP请求时,用户代理将在Cookie标头中包含cookie。 com。
第4.1.2.4节:
仅当request-uri的路径部分与cookie的Path属性匹配(或是cookie的子目录)时,用户代理才会将cookie包含在HTTP请求中,其中%x2F(“ /”)字符被解释为目录分隔符。
所以,如果你从域名来回移动以IP地址,例如,example.com
并且12.34.56.78
,由服务器创建一个会话cookieexample.com
不会被用户代理发送回来,如果你以后做出的请求12.34.56.78
,即使双方都在同一台服务器。对于更高版本的请求,由于服务器看不到会话cookie,因此将创建一个新会话并发送一个新cookie。这就是为什么同时使用域名和IP地址将使用单独的会话的原因。
如果在同时使用域名和IP地址时需要使用相同的会话,则必须保留请求之间的会话ID。一种常见的方法是在查询字符串中传递会话ID。实际上,PHP会话管理也可以配置为使用此方法,但是我永远不需要使用它,因此我无法告诉您该如何进行。
继续我的示例,您可以将其用于后续请求:
http://12.34.56.78/?sessionId=abcdef0123456789
abcdef0123456789
会话ID示例在哪里。
在PHP代码中,在调用之前设置会话ID session_start()
。示例代码:
if(isset($_GET['sessionId']))
session_id($_GET['sessionId']);
@session_start();
当然,您不必使用sessionId
。您可以使用foobar
或其他任何方式。您也可以每天甚至每小时更改一次,以防止会话劫持。
更新:要使用foobar
,请将PHP代码修改为此:
if(isset($_GET['foobar']))
session_id($_GET['foobar']);
@session_start();
使用该代码,您可以像这样传递会话ID:
http://12.34.56.78/?foobar=abcdef0123456789
如果要使用xyz
,则PHP代码为:
if(isset($_GET['xyz']))
session_id($_GET['xyz']);
@session_start();
您可以像这样传递会话ID:
http://12.34.56.78/?xyz=abcdef0123456789
关键是,这取决于您。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句