项目场景
在学习尚硅谷的商城项目中实现单点登录功能
PS:正常的单点登录应该是在设置cookie的时候,将cookie的domain属性设置为父域的域名,同时将cookie的path属性设置为根路径,将token保存到父域中,这样所有的子域应用就可以访问到这个cookie,例如gmall.com和list.gmall.com就是父子域名关系,我由于一些原因没有设置域名。
问题描述
在登录页面登陆后,已经设置过了token和userinfo,userinfo里面包含昵称,在跳转到首页后,按理说应该在首页页面进行显示,但是首页并没有显示昵称,并且查看当前页面包含的cookie,也找不到token和userinfo信息
这里是具体展示:
这里是首页:
进入登录页面:
登录验证成功后开始设置token和userinfo的cookie:
设置token:
设置userinfo:
此时cookie值都已经设置上:
登录成功之后,会重定向到登录之前的网址
可以发现,在重定向之后,之前所设置的cookie都已经消失不见了,而在首页的header页面,昵称当然也没有显示,明明已经登录过了,但是仍然是登录之前的页面
登录成功之后显示不正确的页面
登录成功之后应当显示的正确页面
原因分析
经过长时间的调试代码,最终发现,只是由于一个很小的问题导致达不到想要的效果,是因为把127.0.0.1打成了127.0.1.1
代码展示:
这个是header页面的代码,也就是在首页点击登录后,它跳转到了以127.0.1.1为ip地址的页面,也就是这个页面
因此在登录成功之后设置cookie的作用域,实际上是127.0.1.1,设置完之后再进行跳转,跳转到的是以127.0.0.1为ip地址的首页,这两个页面的ip地址不同,cookie只存在于以127.0.1.1为ip地址的页面,因此在跳转回以127.0.0.1为首页的页面后,userinfo和token这两个cookie值都没有,因此昵称也无法正常的在页面显示,还是未登录的页面。
cookie解释:如果在设置cookie时不指定domain属性,那么cookie的默认作用域是创建cookie的页面所在的域名。
这里是登录成功并且设置cookie之后跳转首页的代码:
window.location.href="http://127.0.0.1:9001/index"
解决方案
解决方案很简单,只需要把header页面中login方法的跳转页面的ip地址修改为127.0.0.1即可
代码展示:
login() {
//window.location.href:页面的跳转
//window.location.href:获取地址栏的内容
/*路径一样不要设置错我设置成了127.0.1.1*/
window.location.href = 'http://127.0.0.1:9001/login/login.html?originUrl='+window.location.href
},
再次测试:
点击登录按钮跳到登录页面:
可以发现,此时的ip地址已经是127.0.0.1,和首页的ip地址相同,这样就能保证设置的cookie值在两个页面之中都会存在
这里是登录之后跳转到首页的页面:
可以发现,此时的userinfo和token的cookie值都已经存在,首页的昵称可以正常显示,表示登录成功
总结
127.0.0.1和127.0.1.1有什么不同?
127.0.0.1和127.0.1.1都是本地回环地址,用于在计算机上进行网络通信测试。它们的区别在于:
127.0.0.1是最常见的本地回环地址,也被称为"localhost"。它通常用于本地主机上的服务和应用程序进行通信。
127.0.1.1是一种特殊的本地回环地址,通常在某些Linux发行版中使用。它被用作本地主机名的别名,用于在本地主机上运行的网络服务和应用程序之间进行通信。
总的来说,127.0.0.1是通用的本地回环地址,而127.0.1.1是特定于某些Linux发行版的本地回环地址。