JS获取Cookie失败
项目开发日记-bug多多篇(1)
在做评论功能的时候遇到了一个很无厘头的错误,我的思路是参照点赞功能,用Ajax技术异步完成评论信息的传输,然后展示在页面上。
那么在提交评论信息的同时,要连着用户名,文章编号等信息一起提交。那很显然这些用户信息应该用cookie保存(也有别的方式,session什么的,我选择用cookie)那么用户的状态信息应该要在登录的时候就记录到cookie里,为此我写了一个CookieUtil,方便后面对cookie进行get set操作。

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map; public class CookieUtil { /**
*保存cookie
* @param response
* @param key
* @param value
* @param time
* @return
*/
public static HttpServletResponse setCookie(
HttpServletResponse response,String key,String value,int time){
//new 一个Cookie对象,键值对是参数
Cookie cookie = new Cookie(key,value);
//以"/"开头的url都能访问cookie
cookie.setPath("/"); //对cookie编码进行设置
try{
URLEncoder.encode(value,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//设置cookie生命周期
cookie.setMaxAge(time);
//将cookie添加到Response中,cookie没有更新,只能覆盖
response.addCookie(cookie);
return response;
} /**
* 将cookie封装到Map中
* @param request
* @return
*/
private static Map<String,Cookie> ReadCookieMap(HttpServletRequest request){
Map<String,Cookie> cookieMap = new HashMap<String,Cookie>();
Cookie[] cookies = request.getCookies();
if (null != cookies){
for (Cookie cookie:cookies){
cookieMap.put(cookie.getName(),cookie);
}
}
return cookieMap;
} /**
* 根据名字获取Cookie
* @param request
* @param name
* @return
*/
public static Cookie getCookieByName(HttpServletRequest request,String name){
Map<String,Cookie> cookieMap = ReadCookieMap(request);
if (cookieMap.containsKey(name)){
Cookie cookie = (Cookie) cookieMap.get(name);
return cookie;
}else {
return null;
}
} /**
* 删除无效cookie
* @param response
* @param request
* @param deleteKey
*/
private void delectCookieByName(
HttpServletResponse response,HttpServletRequest request,String deleteKey){
Map<String,Cookie> cookieMap = ReadCookieMap(request);
for (String key:cookieMap.keySet()){
if (key==deleteKey && key.equals(deleteKey)){
Cookie cookie = cookieMap.get(key);
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}
}
}
}
CookieUtil
那么在对应需要提取cookie的页面我也写了一个getCookie()方法

1 function getCookie(name) {
2 var arr = document.cookie.split(";");
3 console.log(arr);
4 for (var i=0; i<arr.length; i++){
5 var arr2 = arr[i].split("=");
6 console.log(arr2);
7 if (arr2[0] === name){
8 console.log(arr2[0]);
9 return arr2[1];
10 }
11 }
12 return null;
13 }
getCookie
那么事实上我的cookie内包含了一下内容

可以看到有三个cookie,名称分别为debateId、username、teamId;那么正常情况下我只需要使用getCookie("username")这样的方式就能调用方法获取到对应的cookie值,但是实际上拿到的值是null,根据getCookie的方法体可以想到是在整个Cookie里都没有找到key=username的cookie。这不是放屁吗?怎么可能没有。

打断点后可以看到,确实是遍历了所有cookie,没找到username然后就赋值了null。怪事
中间的过程就不说了,没有技术含量,搞了一小时,忽然眼尖发现:

这怎么有个空格啊???不是我忙了半天就是因为一个空格吧?然后把getCookie("username")加一个空格成getCookie(" username")就行了。
多少有点走近科学的味了
晚点探究一下这个空格是哪来的,目前重点怀疑对象j就是split方法和setCookie方法。现在是!干饭时间!♂️
干完饭了,探究一下。其实吃饭的时候我想了一下,应该不是split方法的问题,不然在我的getCookie方法里用了两次split那应该在cookie里有很多的空格,打断点看看到底是什么地方来的空格。

再进add方法里看看

刚刚隔壁的同学路过跟我一起看了一下,教了我ctrl+alt+点击方法名可以看到这个方法的接口什么的。
都断一断

debug跑一下看看

` 传参没问题,下一步,response的addCookie方法,重点怀疑对象

其实插入的Cookie本身是没有空格的
然后我看了一下别人的网站,比如博客园
打开网站后F12打开控制台,刷新页面到Network找一个带有cookie的接口

也有空格!猜测就是addCookie的底层方法里有这个;后面加一个空格的规则,或者是response的格式是这样的?留一个疑问,有大佬可以帮忙解答一下嘛?
JS获取Cookie失败的更多相关文章
- js获取cookie
js获取cookie 之前用jQuery.cookie来获取cookie,虽然简单,但是项目上又多引用了一个插件,总觉得不太好,下面是我封装的js原生获取cookie的函数. function get ...
- node.js获取cookie
node.js 获取cookie var Cookies ={}; if (req.headers.cookie != null) { req.headers.cookie.split(';').fo ...
- js获取cookie数据并发送给服务端
js获取cookie数据并发送给服务端 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- js获取cookie中存储的值
最近看了试卷题目发现自己会的十分的匮乏, 第一题就把自己难住了,知道有这个东西,但是实际上没有操作过. ========================================= cookie ...
- 通过js获取cookie的实例及简单分析
今天碰到一个在firefox下swfupload 上传时session不一致问题 在一个项目遇到多文件上传时,firefox下,服务器端的session获取不一致问题. 解决办法: 解决办法:将ses ...
- js获取cookie提取用户名asp.net+html
JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...
- 转 通过js获取cookie的实例及简单分析
今天review新人写的javascript代码的时候发现了很多的问题.这里以function getCookie(name){}为例. 其中比较典型的一个问题就是如何通过javascript获取co ...
- js封装Cookie操作 js 获取cookie js 设置cookie js 删除cookie
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code var CookieUtil = { // 设置cookie set : functi ...
- 用js获取cookie
//获取cookiefunction cookie_email(cookie_name){ var cookiestr = document.cookie; if (cookiestr.length ...
随机推荐
- Spring cache源码分析
Spring cache是一个缓存API层,封装了对多种缓存的通用操作,可以借助注解方便地为程序添加缓存功能. 常见的注解有@Cacheable.@CachePut.@CacheEvict,有没有想过 ...
- 什么是Hystrix?
防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)服务降级:双十一 提示 哎哟喂,被挤爆了. app秒杀 网络开小差了,请稍后再试.优先核心服务,非核心服务不可用 ...
- 什么是CopyOnWriteArrayList,它与ArrayList有何不同?
CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add.set等等)都是通过对底层数组进行一次新的复制来实现的.相比较于ArrayList它的写操作 ...
- js的json序列化和反序列化
(1)序列化 即js中的Object转化为字符串 1.使用toJSONString var last=obj.toJSONString(); //将JSON对象转化为JSON字符 2.使用string ...
- 如何实现集群中的 session 共享存储?
Session 是运行在一台服务器上的,所有的访问都会到达我们的唯一服务器上,这 样我们可以根据客户端传来的 sessionID,来获取 session,或在对应 Session 不 存在的情况下(s ...
- 创建POJO
创建一个名为student.java的POJO. 第一步,在包里面创建一个student类,右键点击包,点击新建,再点击创建一个类. 第二步,输入类名,点击完成. 第三步,输入数据类型和主键名,再写一 ...
- 学习Apache(四)
介绍 Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作.不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率. ...
- java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?重写跟重载的区别?
java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况.与此相对,方法覆盖是说子类重新定义了父类的方法.方法覆盖必须有相同的方法名,参数列表和返回类型. 覆盖者可能不会限 ...
- java后台解决上传图片翻转90的问题,有demo,经过测试可用
1.需要加入 依赖 metadata-extractor.jar 依赖如下 <dependencies> <!-- Extracts Exif, IPTC, XMP, ICC and ...
- Java设置方法模板