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 ...
随机推荐
- 论文翻译:2021_论文翻译:2018_F-T-LSTM based Complex Network for Joint Acoustic Echo Cancellation and Speech Enhancement
论文地址:https://arxiv.53yu.com/abs/2106.07577 基于 F-T-LSTM 复杂网络的联合声学回声消除和语音增强 摘要 随着对音频通信和在线会议的需求日益增加,在包括 ...
- 变频器通讯参数PKW和PZD的含义
SINAMICS S120 S150 参数手册 章节3.9 PROFIdrive 图3-41 功能图2422制造商专用报文和过程数据 参考:https://www.diangon.com/wenku/ ...
- 专访 KubeVela 核心团队:如何简化云原生复杂环境下的应用交付和管理
作者 | Infoq Tina 背景 12 月 9 日,在 2021 年 KubeCon 云原生技术峰会上,CNCF 开源项目 KubeVela 宣布推出了 1.2 版本. KubeVela 是一个简 ...
- python编程笔记--字符编码
ASCII码.Unicode.utf-8 ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电 ...
- 网络编程 --安装wkhtmltopdf出现中文乱码的情况
1 首先下载安装包 2安装依赖文件apt-get install libxfont1 xfonts-encodings xfonts-utils xfonts-base xfonts-75dpi su ...
- BLOB 和 TEXT 有什么区别?
BLOB 是一个二进制对象,可以容纳可变数量的数据.TEXT 是一个不区分大小写 的 BLOB. BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小 写,对 TEX ...
- java-规约-日期和时间
public class DateTime { public static void main(String[] args) { /**1 * 日期格式化时,传入的pattern表示年份统一用小写的y ...
- java-設計模式概述
什麽是設計模式?? 软件设计中常见问题的典型解决方案. 能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题. 模式并不是一段特定的代码, 而是解决特定问题的一般性概念. 你可以根据模式 ...
- 说说三元运算和if...else的相同之处
三元运算符和if-else语句:不同之处. a) 三元运算符是必须要有返回值,而if-else语句并不一定有返回值,其执行结果可能是赋值语句或者打印输出语句. b) java三元表达式有字符强转(双目 ...
- HTML 5中的DataList是什么?
HTML 5中的DataList控件元素有助于提供自动完成功能的文本框,如下图所示. 下面是DataList控件功能的HTML代码: <input list="Country" ...