项目开发日记-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. grep 命令?

    强大的文本搜索命令,grep(Global Regular Expression Print) 全局正则表达式搜索.grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板.如果模板包括空格, ...

  2. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法 ?

    面试官:想了解对 ES 集群的运维能力. 解答: 1.关闭缓存 swap; 2.堆内存设置为:Min(节点内存/2, 32GB); 3.设置最大文件句柄数: 4.线程池+队列大小根据业务需要做调整: ...

  3. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

    启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解: @SpringBootConfiguration:组合了 ...

  4. python 函数基础知识

    1.函数返回的多个值会被组织成元组被返回,也可以用多个值来接收 2.调用函数时候,传入的参数叫实际参数,简称实参,定义函数的参数叫做形式参数,简称形参-- 位置参数 def mymax(x,y): a ...

  5. String 是最基本的数据类型吗?

    不是. Java中基本数据类型只有8个:byte.short.int.long.float.double.char.boolean:除了基本类型(primitive type),剩下都是引用类型(re ...

  6. List、Map、Set 三个接口存取元素时,各有什么特点?

    List 以特定索引来存取元素,可以有重复元素.Set 不能存放重复元素(用对象的 equals()方法来区分元素是否重复).Map 保存键值对(key-value pair)映射, 映射关系可以是一 ...

  7. 学习Apache(二)

    反向代理负载均衡之APACHE 一.反向代理1.1 介绍反响代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将 ...

  8. 自定义XML文件模板步骤

  9. Python学习—(windows系统下)安装pygame

    浏览器搜索pygame的windows安装程序,下载与python版本相匹配的文件. 如果.exe文件直接运行: 如果.whl文件,将其复制到要用到的项目文件夹中,在cmd窗口中切换到该文件所在的文件 ...

  10. canvas —— globalCompositeOperation

    globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上. 源图像 = 您打算放置到画布上的绘图. 目标图像 = 您已经放置在画布上的绘图. ...