Cookie对象和常用API介绍与(禁用JSESSIONID)用Cookie展示用户上次浏览商品记录信息案例

用Cookie展示用户上次浏览商品记录信息

我将Cookie对象和常用API介绍放在文章后面,如果你对Cookie对象的使用不熟悉,请点击目录往下翻。

模拟使用Cookie展示用户上次浏览商品记录信息

在这里插入图片描述

设计思路(实现原理)

1) 创建Demo1类继承Httpservlet类,

2) 在Demo1中获取所有的cookie并遍历,查看是否有上次存储的浏览商品记录信息,如果没有通过Cookie cookie=new Cookie(“product” , “IPhone7”); 设置,否则显示出所有保存在cookie中的商品。

3)注解配置Demo1映射

4)通过浏览器访问Demo1,查看页面效果。

一个问题:浏览器自动生成SESSIONID会话cookie

理论上我们因该拿到为(的浏览商品记录信息)cookie,然后给它赋值。

但是我们还没给cookie设置就可以拿到一个name为JSESSIONIDD的cookie,

在这里插入图片描述
在这里插入图片描述

发现浏浏览器自动生成JSESSIONIDD,鼠标点击右键删除,刷新后又重新生成。

(如何让他不自动生成?)

在这里插入图片描述

JSESSIONID(简单介绍一下)

JSESSIONID就是一个cookie,Servlet容器(tomcat,jetty)用来记录用户session。

2.1、什么时候浏览器自动生成JSESSIONID会话cookie?

  • 创建会话时,即调用request.getSession()的时候;
  • 访问html是不会创建session的,第一次访问JSP页面默认是会创建session的,可以在JSP页面里面关掉自动创建session。我们可以通过添加以下JSP指令:**<%@ page session=“false” %>**就可以禁用JSESSIONID

我们先禁用自动生成JSESSIONIDD

在jsp页面添加**<%@ page session=“false” %>禁用session**,就可以禁用自动生成JSESSIONID

在这里插入图片描述

运行后发现还有JSESSIONIDD,鼠标->右键->(选择delet) 删除它。

(手动刷新一下,不会重新生成JSESSIONIDD)。

在这里插入图片描述
在这里插入图片描述

再试一次,控制台打印输出cookie为null了。

在这里插入图片描述

好了,接下来代码实现

Demo1

在这里插入图片描述

package com.gd.servlet;

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;

/**
 * @author LFXIANG
 * description TODO
 * @title Demo1
 * date 2024/3/30 19:51
 */
@WebServlet("/Demo1")
public class Demo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
//        是否有cookies
        if (cookies!=null){
            for (Cookie cookie:cookies){
                String name = cookie.getName();
//                在cookies中查找name是否为product的cookie
                if (name.equals("product")){
//                    打印输出product的value,并及结束循环
                    String value = cookie.getValue();
                    resp.setContentType("text/html;charset=utf-8");
                    resp.getWriter().write("您上次浏览的商品为: "+value);
                    break;
                }
            }
//            cookies中有cookie,但是没有name为product的cookie,创建cookie
            Cookie cookie = new Cookie("product", "XIAOMI");
            resp.addCookie(cookie);
//            没有cookies(一个cookie都没有)
        }else {
            resp.getWriter().write("No cookie");
//           创建cookie并在响应头添加cookie信息
            Cookie cookie = new Cookie("product", "XIAOMI");
            resp.addCookie(cookie);
        }
    }
}


运行

在这里插入图片描述

刷新
在这里插入图片描述

Cookie对象和常用API介绍

什么是Cookie

  • Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。

  • 一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给Web服务器。

  • 一个Cookie主要由标识该信息的名称(name)和值(value)组成。

创建Cookie

		//创建Cookie
		Cookie ck=new Cookie("code", code);
		ck.setPath("/webs");//设置Cookie的路径
		ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0浏览器关闭;<0内存存储,默认-1
		response.addCookie(ck);//添加到response对象中,响应时发送给客户端
        //注意:有效路径: 当前访问资源的上一级目录,不带主机名

获取Cookie

//获取所有的Cookie
Cookie[] cks=request.getCookies();
		//遍历Cookie
		for(Cookie ck:cks){
          //检索出自己的Cookie
			if(ck.getName().equals("code"))
			{
              //记录Cookie的值
				code=ck.getValue();
				break;
			}
		}

修改Cookie

只需要保证Cookie的名和路径一致即可修改

	//修改Cookie
    Cookie ck=new Cookie("code", code);
    ck.setPath("/webs");//设置Cookie的路径
    ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
    response.addCookie(ck);//让浏览器添加Cookie

Cookie编码与解码

Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码。

  • 编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法

  • 解码使用java.net.URLDecoder类的decode(String str,String encoding)方法

  • 32
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值