Cookie在浏览器中无法存在的问题

我采取以正确的写法往错误写法推导,展示错误,并给予解决

1 简单写法,正常情况下

代码:
此代码主要功能是:第一次访问servlet,创建一个cookie;第二次再访问这个servlet,读取cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        //设置request编码
        request.setCharacterEncoding("utf-8");
        //设置response编码
        response.setContentType("text/html;charset=utf-8");

        //第一次访问服务器,服务器向客户端写cookie
        //设置cookie的名字
        String cookieName="lastTime";
        //设置cookie的内容
        String cookieValue="cookieValue!!!";
        //创建cookie
        Cookie cookie = new Cookie(cookieName,cookieValue);
        //设置cookie的有效时间
        cookie.setMaxAge(60*60);//秒为单位 3600s为1小时
        //添加cookie
        response.addCookie(cookie);

        //读取cookie
        Cookie[] cookies = request.getCookies();
        //cookie内的值拿出
        String lastTime=null;
        //不为空则读出来输出到页面
        if (cookies!=null && cookies.length>0){
            for(Cookie cookieNew:cookies){
                String cookieRequestName=cookieNew.getName();
                if ("lastTime".equals(cookieRequestName)){
                    lastTime=cookieNew.getValue();
                    break;
                }
            }
            //输出到页面
            response.getWriter().println("您已经访问过了,lastTime="+lastTime);
        }else {
            //输出到页面
            response.getWriter().println("您是第一次访问本页面!");
        }

    }
}

运行结果:

第一次访问:

java 获取不到配置文件信息 java获取不到cookie_cookie


查看一下cookie(谷歌浏览器):

java 获取不到配置文件信息 java获取不到cookie_servlet_02


第二次访问:

java 获取不到配置文件信息 java获取不到cookie_cookie_03


最简单的cookie创建,可以发现并没有出错;

而且楼主在“360浏览器”、“火狐”、“Edge”、“IE”、“谷歌”测试均无问题。

2. 修改cookie内容(添加一个空格),出现错误

问题:
对cookie内容添加一个空格!

//设置cookie的内容
String cookieValue="cookie Value!!!";

谷歌报错:

java 获取不到配置文件信息 java获取不到cookie_java_04


原因:

整体意思就是这个cookie内容有个字符我们无法识别!

那个字符是什么呢?是空格;为什么无法识别空格?又是编码跟解码的问题。

在ASCII码中32对应的就是空格。

解决方法:

1.望梅止渴法:删去空格,不用不报错;

2.服务器使用URLEncoder.encode()编码;客户端/服务端再使用URLDecoder.decode()解码;

需要导包import java.net.*;

上代码:

发送cookie时对内容的编码

//设置cookie的内容
String cookieValue="cookie Value!!!我不仅要空格还打中文!!!";
//给此内容编码
cookieValue=URLEncoder.encode(cookieValue,"utf-8");

接收cookie时对内容的解码

for(Cookie cookieNew:cookies){
	String cookieRequestName=cookieNew.getName();
	if ("lastTime".equals(cookieRequestName)){
		lastTime=cookieNew.getValue();
		//解码
		lastTime=URLDecoder.decode(lastTime,"utf-8");
		break;
	}
}

再次运行:

java 获取不到配置文件信息 java获取不到cookie_cookie_05


查看一下编码过的cookie长啥样?

java 获取不到配置文件信息 java获取不到cookie_java 获取不到配置文件信息_06


此错误结束。

此方法适用于内容需要有空格,或者内容需要有中文

3. setPath()后,输出页面无法读取cookie

问题:
我在正确代码基础上给cookie设置setPath():

//设置cookie的获取范围
cookie.setPath("/Session");
//添加cookie
response.addCookie(cookie);

再次运行:刷新后仍是这个页面

java 获取不到配置文件信息 java获取不到cookie_java_07


原因:

查看一下cookie

java 获取不到配置文件信息 java获取不到cookie_servlet_08


可以看到cookie仍是存在的,为什么当前页面读取不了呢?因为设置了路径/Session,这代表着只有这个/Session路径下的服务器资源可以访问这个cookie,其他资源可远观而不可亵玩焉。

解决:

1.在Session目录下的资源去访问这个cookie

java 获取不到配置文件信息 java获取不到cookie_java_09


用SessionServlet去访问cookie

java 获取不到配置文件信息 java获取不到cookie_java_10


成功。

2.如果想让当前项目的所有资源都能访问此cookie,那么就设置setPath("/");

3.或者不去设置这个方法,默认值也是setPath("/")。

4. setDomain()后,输出页面没有cookie

问题:
我在正确代码基础上给cookie设置setDomain():

//设置cookie的跨域访问
cookie.setDomain("127.0.0.1");
//添加cookie
response.addCookie(cookie);

运行:

java 获取不到配置文件信息 java获取不到cookie_服务器_11


无设置的cookie

原因:

setDomain()是为了跨域访问的,默认值是localhost,我这里虽然填“127.0.0.1”确实是本机的ip,但不支持这种写法。

如:setDomain(".baidu.com"),那么 tieba.baidu.com 和 news.baidu.com 中 Cookie 可以共享;

我们这里并没有设置域名,不需要对这个方法进行设置。

解决方法:

1.删除setDomain();采用默认值localhost;

2.setDomain(“localhost”);

适用任意一种,页面恢复到正确水平。

以上就是cookie的正确写法以及cookie可能出现的一些错误。
如果对您有所帮助,请点赞支持一下作者~