项目开发日记-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失败的更多相关文章

  1. js获取cookie

    js获取cookie 之前用jQuery.cookie来获取cookie,虽然简单,但是项目上又多引用了一个插件,总觉得不太好,下面是我封装的js原生获取cookie的函数. function get ...

  2. node.js获取cookie

    node.js 获取cookie var Cookies ={}; if (req.headers.cookie != null) { req.headers.cookie.split(';').fo ...

  3. js获取cookie数据并发送给服务端

    js获取cookie数据并发送给服务端 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  4. js获取cookie中存储的值

    最近看了试卷题目发现自己会的十分的匮乏, 第一题就把自己难住了,知道有这个东西,但是实际上没有操作过. ========================================= cookie ...

  5. 通过js获取cookie的实例及简单分析

    今天碰到一个在firefox下swfupload 上传时session不一致问题 在一个项目遇到多文件上传时,firefox下,服务器端的session获取不一致问题. 解决办法: 解决办法:将ses ...

  6. js获取cookie提取用户名asp.net+html

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...

  7. 转 通过js获取cookie的实例及简单分析

    今天review新人写的javascript代码的时候发现了很多的问题.这里以function getCookie(name){}为例. 其中比较典型的一个问题就是如何通过javascript获取co ...

  8. js封装Cookie操作 js 获取cookie js 设置cookie js 删除cookie

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code var CookieUtil = { // 设置cookie set : functi ...

  9. 用js获取cookie

    //获取cookiefunction cookie_email(cookie_name){ var cookiestr = document.cookie; if (cookiestr.length ...

随机推荐

  1. XML常用解析API有哪几种?

    XML常用解析API有JAXP.JDOM.Dom4j等. JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口 ...

  2. 分布式HDFS的安装和启动(二)

    一.分布式HDFS的安装和启动①在$HADOOP_HOME/etc/hadoop/core-site.xml文件<property> <name>fs.defaultFS< ...

  3. Canvas将图片转换成base64形式展示的常见问题及解决方案

    导航1:https://blog.csdn.net/weixin_30668887/article/details/98822699 导航2:https://stackoverflow.com/que ...

  4. Java并发机制(2)--synchronized与Lock

    本内容整理自:博客园-海 子-java并发编程系列-http://www.cnblogs.com/dolphin0520/category/602384.html 1.基础: 1.什么时候出现线程安全 ...

  5. jQuery--文档处理案例

    需求 如上图,实现左右两边的选择菜单可以左右移动,'>'按钮一次只能移动被选中的一个菜单,'>>'按钮一次移动所有被选择的菜单,'>>>'按钮 将所有菜单进行移动, ...

  6. Redis 的回收策略(淘汰策略)?

    volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最 少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i ...

  7. 区分构造函数注入和 setter 注入?

    构造函数注入 setter 注入 没有部分注入 有部分注入 不会覆盖 setter 属性 会覆盖 setter 属性 任意修改都会创建一个新实例 任意修改不会创建一个新实例 适用于设置很多属性 适用于 ...

  8. Java 中,抽象类与接口之间有什么不同?

    Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个 类只能继承一个类,但是可以实现多个接口.抽象类可以很好的定义一个家族类 的默认行为,而接口能更好的定义类型,有助于后 ...

  9. dll反编译(修改引用文件、修改代码)再生成dll

    问题描述 我们在日常开发中经常会遇到,想要对dll文件做修改的操作,但苦于没有源代码,只能想想其他办法 解决问题 办法就是通过几个工具来反编译.正向编译.修改属性 反编译.正编译 参考https:// ...

  10. uniapp-npm install 进入版本后 优先运行全局安装,在HBuilder X终端输入 npm install 点击回车

    uniapp-npm  install 进入版本后 优先运行全局安装,在HBuilder X终端输入 npm  install 点击回车