一.Javaweb Cookie
1.1 会话
用户打开浏览器,单击多个超链接,访问多个web资源,然后关闭浏览器的过程叫做会话。
1.2 Cookie和Session的区别
Cookie:服务端给了客户端一个标头,客户端下次访问带上标头即可,在本地保存。
Session:服务器登记本机访问记录,下次访问服务器匹配数据库数据。
1.3 保存会话的俩种技术
Cookie
- 客户端的技术,主要有响应和请求
Session
- 服务器端的技术,利用这个技术,可以保存用户的会话记录。
- 可以把信息和数据保存在session里。
二.对于Cookie记录实战
1.新建立maven工程,工程名为:servlet-session-chookie。
2.新建java目录为,存放项目的目录路径。
3.新建接口,接口名为:com.gowork.servlet。
4.在com.gowork.servlet接口下新建类,类名为CookieDemo1。
5.继承类HttpServlet,重写doGet方法,doPost指向doGet。
6.提前设置编码类型,请求和我响应:
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
7.chookie服务端想客户端获取。
Cookie[] cookies = req.getCookies();
8.服务器每次访问,获取一次时间存储。
Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
resp.addCookie(cookie);
9.如果第7步的cookies不为空的话。输出上一次访问的时间的提示语句。
遍历cookies,获取cookies名称为低8步骤的lasttime的值,进行响应个前端。
for(int i=0;i < cookies.length; i++){
Cookie cookie = cookies[i];
if(cookie.getName().equals("lasttime") ){
cookie.getValue();
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
out.write(date.toLocaleString());
}
10.如果第8步的cookies为空的话,输出:第一次访问。
并且下面的cookie继续执行,获取到当前时间存储到用户本地的chooice里,名称为“:lasttime,看上面的第八步。
11.配置注册url,写url的映射。
<servlet>
<servlet-name>cookie</servlet-name>
<servlet-class>com.gowork.servlet.CookieDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookie</servlet-name>
<url-pattern>/co5</url-pattern>
</servlet-mapping>
12.设置tomact的访问路径。
C:\Users\24190\IdeaProjects\xiao\servletr-session-chookie\src\main\webapp
13.启动tomact服务器。访问路径:
localhost:8080/servletr-session-chookie/co5
14.访问效果图如下:
第一次访问:
多次访问;
15.设置cookie的有效期:
cookie.setMaxAge(24*60*60);
运行项目,打开F12,查看网络,发现有效期为一天。
Set-Cookie: lasttime=1661136845468; Max-Age=86400; Expires=Tue, 23-Aug-2022 02:54:05 GM
2.1 cookie常用合集
获取cookie:
Cookie[] cookies = req.getCookies();
获取cookie的key和value:
cookie.getName()
cookie.getValue()
新建一个cookie:
Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
设置cookie的有效期:
cookie.setMaxAge(24*60*60)
响应个客户端一个cookie:
resp.addCookie(cookie);
2.2 细节问题
- 一个cookie只能保存一条信息;
- 一个网站可以向浏览器发送多个cookie,并最多存储20个cookie;
- Cookie大小限制为4KB;
- 300个Cookie浏览器限制;
删除cookie:
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期,超出有效期,cookie失效
- 设置有效期时间为0
2.3 删除一个cookie
1.创建一个cookie的类,类名为:CookieDemo2
2.继承HttpServlet,重写doGet方法,doPost方法指向于doGet。
3.创建一个cookie,名称要与被删除的cookie相同。
Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
4.设置cookie的有效期为0:
cookie.setMaxAge(0);
5.响应回客户端。
resp.addCookie(cookie);
6.注册url,写映射:
<servlet>
<servlet-name>cookie02</servlet-name>
<servlet-class>com.gowork.servlet.CookieDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookie02</servlet-name>
<url-pattern>/co2</url-pattern>
</servlet-mapping>
7.启动web容器,访问url观察:
第二次访问:co5:
访问co2,删除cookie:
再次访问co5:
结果发现cookie被删除,变为第一次访问!
2.4 编码解码
在前后端传输过程请中,对中文传输容易造成乱码问题。这里用到网络编程的知识点,编码与解码:
编码:
Cookie cookie = new Cookie("name", URLEncoder.encode("菜猪", StandardCharsets.UTF_8));
解码:
out.write(URLDecoder.decode(cookie.getValue(), StandardCharsets.UTF_8));
编码解码效果成功图如下:
这样传输更加安全,有效的避免了中文乱码问题。