为什么
建议百度搜索他俩的区别
关键词(如果你遇到类似问题,不妨参考我的思路)
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
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了