用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)方法