【JavaWeb开发】Cookie在浏览器中的问题

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("您是第一次访问本页面!");
        }

    }
}

运行结果:
第一次访问:
在这里插入图片描述
查看一下cookie(谷歌浏览器):
在这里插入图片描述
第二次访问:
在这里插入图片描述
最简单的cookie创建,可以发现并没有出错;
而且楼主在“360浏览器”、“火狐”、“Edge”、“IE”、“谷歌”测试均无问题。

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

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

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

谷歌报错:
在这里插入图片描述
原因:
整体意思就是这个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;
	}
}

再次运行:
在这里插入图片描述
查看一下编码过的cookie长啥样?
在这里插入图片描述
此错误结束。
此方法适用于内容需要有空格,或者内容需要有中文

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

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

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

再次运行:刷新后仍是这个页面
在这里插入图片描述
原因:
查看一下cookie
在这里插入图片描述
可以看到cookie仍是存在的,为什么当前页面读取不了呢?因为设置了路径/Session,这代表着只有这个/Session路径下的服务器资源可以访问这个cookie,其他资源可远观而不可亵玩焉。
解决:
1.在Session目录下的资源去访问这个cookie
在这里插入图片描述
用SessionServlet去访问cookie
在这里插入图片描述
成功。
2.如果想让当前项目的所有资源都能访问此cookie,那么就设置setPath("/");
3.或者不去设置这个方法,默认值也是setPath("/")。

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

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

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

运行:
在这里插入图片描述
无设置的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可能出现的一些错误。
如果对您有所帮助,请点赞支持一下作者~

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值