当前位置 : 主页 > 编程语言 > java >

对Cookie运用的实战与原理剖析详解

来源:互联网 收集:自由互联 发布时间:2022-09-02
@[toc] 一.Javaweb Cookie 1.1 会话 用户打开浏览器,单击多个超链接,访问多个web资源,然后关闭浏览器的过程叫做会话。 1.2 Cookie和Session的区别 Cookie:服务端给了客户端一个标头,客户端

@[toc]

一.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.访问效果图如下:

第一次访问:

image-20220822103312331

多次访问;

image-20220822103341427

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.响应回客户端。

```java\resp.addCookie(cookie);

6.注册url,写映射: ```xml <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:

image-20220822113444705

访问co2,删除cookie:

image-20220822113514987

再次访问co5:

image-20220822113531642

结果发现cookie被删除,变为第一次访问!

2.4 编码解码

在前后端传输过程请中,对中文传输容易造成乱码问题。这里用到网络编程的知识点,编码与解码:

编码:

Cookie cookie = new Cookie("name", URLEncoder.encode("菜猪", StandardCharsets.UTF_8));

解码:

out.write(URLDecoder.decode(cookie.getValue(), StandardCharsets.UTF_8));

编码解码效果成功图如下:

image-20220822145308802

这样传输更加安全,有效的避免了中文乱码问题。

上一篇:Java基础 | 深入理解多维数组
下一篇:没有了
网友评论