localhost不等于127.0.0.1,不要混用!!!

为什么

建议百度搜索他俩的区别


关键词(如果你遇到类似问题,不妨参考我的思路)

Cookie获取不到
Cookie删不了
Cookie.setMaxAge(0) 无效
Referer一直是 http://localhost:8080/
href.location 跳转不携带参数
无法重定向返回上一页
跨域获取不到Cookie


直接解决方案

request.getCookies()取不到值原因
https://blog.csdn.net/seven_devil/article/details/85068482

方案一:保证Servlet的项目路径 和 页面请求路径在同一地址,要么全用localhost(推荐),要么全用127.0.0.1(不太推荐,因为tomcat默认启动是localhost)

方案二:如果是前后端分离项目,那么就不能直接获取Cookie,因为设计到跨域问题了,实际上我下面遇到的坑,就是不小心“跨域”了,所以导致拿不到Cookie,下面的教程教你怎么用Jsonp 或者 CORS 跨域获取Cookie

前后端分离 | 关于登录状态那些事
https://www.cnblogs.com/boboooo/p/9779355.html


遇到的坑(有点长,没耐心可以不看)

今天做一个JavaWeb项目时遇到一个问题折磨了我两天:

1.可以看见,当前登录页面是通过localhost打开的
在这里插入图片描述
2.登录页面登录成功后,服务器会向客户端添加Cookie
.cn/20210606162948272.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MTExNjMxNA==,size_16,color_FFFFFF,t_70)

3.登录成功后,在Html页面点击退出登录按钮,会访问一个Servlet ("/CalcelLoginServlet");
此时在该Html页面设置了Base路径(注意是127.0.0.1开头的)
在这里插入图片描述

4.页面正常访问到了Servlet,并且Servlet会通过

String referer = request.getHeader("Referer");  //这个发送请求的地址(跳转前的地址)

来获取Cookie和Referer
在这里插入图片描述
上面两个是Cookie(JSESSIONID , NMTID)
下面的是Referer( http://localhost:8080/ )

5.Servlet会判断Cookie中是否包含token_us 和 token_ps 字段
在这里插入图片描述
如果有,那么就会告知客户端删除该Cookie

6.客户端接收到回应后,发现。。。两个Cookie并没有删除,也就无法退出登录,反复尝试都是如此,死活退出登录不了。
在这里插入图片描述


问题分析

首先我们回到第4步看问题出在哪:

客户端传给服务器的Cookie不包含(token_us ,token_ps )两个字段,那么服务器自然删不了这两个Cookie。

那么,为什么浏览器可以看见这两个Cookie,但又不发送给服务器呢?

那么我们看一下,Referer是 http://localhost:8080/,按理来说,Referer是请求跳转前的URL地址,正常应该是http://localhost:8080/Demo2_jsp_Javabean/home/,因为我是从这个页面跳转的。

这么一来,说明请求是先跳转到了 http://localhost:8080/,再跳转到Servlet
可是我点击“退出登录”按钮后只有一件事:

location.href = "CancelLoginServlet";

而Html的Base路径是

<base href="http://127.0.0.1:8080/Demo2_jsp_Javabean/home">

所以拼接起来应该是
http://127.0.0.1:8080/Demo2_jsp_Javabean/home/CancelLoginServlet

但是当前的home页面的路径是
在这里插入图片描述

这么一来,就是localhost 的页面去访问 127.0.0.1的页面
因此!!!
在127.0.0.1的servlet访问不到来自localhost的Cookie
并且!!!
来自localhost的请求会被视为非本地请求,那么Referer只对应该请求的主机+端口号 http://localhost:8080/

而非完整的页面路径
http://localhost:8080/Demo2_jsp_Javabean/home/

问题解决

那么最简单的方式就是修改base路径的127.0.0.1 为 localhost

<base href="http://localhost:8080/Demo2_jsp_Javabean/home">

这样,我就不需要去访问127.0.0.1的servlet了,而是直接访问当前项目(localhost)的servlet

在这里插入图片描述
看,我的servlet终于接受到了token_us 和 tonken_ps
并且打印出正确的访问路径Referer了

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值