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 ...
随机推荐
- tensorflow2.4与目标检测API在3060显卡上的配置安装
目前,由于3060显卡驱动版本默认>11.0,因此,其不能使用tensorflow1版本的任何接口,所以学习在tf2版本下的目标检测驱动是很有必要的,此配置过程同样适用于任何30系显卡配置tf2 ...
- 三分钟掌控Actor模型和CSP模型
回顾一下前文<三分钟掌握共享内存模型和 Actor模型> Actor vs CSP模型 传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行 ...
- 从字符串某位置开始的递增串(dfs)注意for循环中下标的错误
#include <iostream> #include <string> using namespace std; char res[50];int tag=1; void ...
- 《Java多线程编程核心技术》知识梳理
<Java多线程编程核心技术> @author ergwang https://www.cnblogs.com/ergwang/ 文章末尾附pdf和png下载链接 第1章 Java多线程技 ...
- 有没有可能两个不相等的对象有有相同的 hashcode?
有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突.相等 hashcode 值的规定只是说如果两个对象相等,必 须有相同的 hashcode 值, ...
- 学习Tomcat(二)
一. Java简介 JDK: 面向开发人员使用的SDK,提供Java的开发环境和运行环境 SDK: 软件开发包,包括函数库.编译程序等 JRE: Java的运行环境,面向Java的使用者,不是开发者 ...
- Nuxt.js服务端渲染实践,从开发到部署
感悟 经过几个周六周日的尝试,终于解决了服务端渲染中的常见问题,当SEO不在是问题的时候,或许才是我们搞前端的真正的春天,其中也遇到了一些小坑,Nuxt.js官方还是很给力的,提issue后很积极的给 ...
- 软件构造实验-JFinal
导入JFinal的demo 可以增删改查 根据demo以及自己的理解,使用JFinal实现学生信息管理系统.
- activity-alias属性的使用
activity-alias是Android里为了重复使用Activity而设计的.1. 含义和作用: 对于activity-alias标签,它有一个属性叫android:targen ...
- 单例设计模式(Singleton)
一.单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法) 例如:Hibernate的Se ...