博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习总结第五篇--认识Cookie机制
阅读量:4965 次
发布时间:2019-06-12

本文共 4483 字,大约阅读时间需要 14 分钟。

Cookie机制

前言

会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是CookieSession。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。今天,我首先给大家讲解一下Cookie机制,后面我会给大家提到Session的。

什么是Cookie

Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话。所以,要跟踪会话,我们必须引入一种机制。此时,我们就给客户端们颁发一个通行证,无论谁访问都必须出示通行证也就是身份卡。这样服务器就可以通过这个身份卡辨别出身份了。这就是Cookie的工作原理。

我们还可以查看网站颁发的Cookie,只需要在网址栏中输入javascript:alert(document.cookie)就可以了。

记录用户访问次数

Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie对象来对客户端Cookie进行操作,通过request.getCookie()获取客户端提交的所有Cookie,通过response.addCookie(Cookie cookie)向客户端设置Cookie。

Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。

以下代码就是使用Cookie来记录用户账号以及登陆次数的例子。

1 <%@ page import="java.util.Date" %> 2 <%@ page import="java.text.SimpleDateFormat" %> 3 <%-- 4   Created by IntelliJ IDEA. 5   User: Administrator 6   Date: 2015/6/17 7   Time: 11:58 8   To change this template use File | Settings | File Templates. 9 --%>10 <%@ page contentType="text/html;charset=UTF-8" language="java" %>11 <%12   request.setCharacterEncoding("UTF-8");13 14   String username = "";15   int visitTimes = 0;16 17   Cookie[] cookies = request.getCookies();18 19   for (int i = 0; cookies != null && i < cookies.length; i++) {20     Cookie cookie = cookies[i];21     if ("username".equals(cookie.getName())) {22       username = cookie.getValue();23     } else if ("visitTimes".equals(cookie.getName())) {24       visitTimes = Integer.parseInt(cookie.getValue());25     }26   }27   if (username == null || username.trim().equals("")) {28     throw new Exception("请先登录");29   }30   Cookie visitTimesCookie = new Cookie("visitTimes",Integer.toString(++visitTimes));31   response.addCookie(visitTimesCookie);32 %>33 34   35     36   37   38     
39
40
登录信息 当前时间:<%= new Date() %>41
42
43
44
45
46
47
48
49
50
51
52
53
57
58
您的账号: <%= username %>
登录次数: <%= visitTimes %>
54 56
59
60
61
62 63

 

如果没有找到包含username属性的Cookie,则抛出异常,页面跳转到登陆页面login.jsp。

1 <%-- 2   Created by IntelliJ IDEA. 3   User: Administrator 4   Date: 2015/6/17 5   Time: 12:14 6   To change this template use File | Settings | File Templates. 7 --%> 8 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 9 <%10   request.setCharacterEncoding("UTF-8");11   response.setCharacterEncoding("UTF-8");12 13   if ("POST".equals(request.getMethod())) {14     Cookie usernameCookie = new Cookie("username",request.getParameter("username"));15     Cookie visitTimesCookie = new Cookie("visitTimes","0");16 17     response.addCookie(usernameCookie);18     response.addCookie(visitTimesCookie);19 20     response.sendRedirect(request.getContextPath() + "/cookie.jsp");21     return ;22   }23 %>24 25   26     请先登录27   28   29     
30
31
登录32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
账号:
密码:
47
48
49
50 51

 

另外,Cookie还具有以下一些特点:

  • 不可跨域名性,Google和Baidu的Cookie是分开的,各自访问时显示的是各自的Cookie。
  • Cookie中保存中文只能编码
  • Cookie中可以保存二进制数据,比如使用数字证书

下面的程序使用UTF-8编码了Cookie内容,然后再使用UTF-8解码Cookie并显示出来。

 

1 <%-- 2   Created by IntelliJ IDEA. 3   User: Administrator 4   Date: 2015/6/17 5   Time: 13:41 6   To change this template use File | Settings | File Templates. 7 --%> 8 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 9 
10
11 <%12 Cookie cookie = new Cookie(13 URLEncoder.encode("姓名","UTF-8"),14 URLEncoder.encode("天才白痴梦","UTF-8"));15 response.addCookie(cookie);16 %>17 18 19 Cookie Encoding20 21 22 <%23 if (request.getCookies() != null) {24 for (Cookie cc : request.getCookies()) {25 String cookieName = URLDecoder.decode(cc.getName(),"UTF-8");26 String cookieValue = URLDecoder.decode(cc.getValue(),"UTF-8");27 28 out.println(cookieName + " : " + cookieValue + ";
");29 }30 }31 else {32 out.println("Cookie 已经写入客户端,请刷新页面。");33 }34 %>35 36

 

 

转载于:https://www.cnblogs.com/BaiYiShaoNian/p/4583116.html

你可能感兴趣的文章
MySQL 5.7开启二进制日志注意事项
查看>>
SQL Server中通用数据库角色权限处理
查看>>
Alpha 冲刺 (9/10)
查看>>
Oracle数据库之序列
查看>>
输入任意IP,将IP转化为minion-IP格式(saltstack)
查看>>
SQL查询-约束-多表
查看>>
谷歌的黑客梦之队
查看>>
JVM GC Roots
查看>>
2.4 传输控制协议(TCP)
查看>>
golang-build-error
查看>>
Docker使用docker-compose.yml构建Asp.Net Core和Mysql镜像并与Mysql数据库通信
查看>>
pause 和 title
查看>>
向值栈放List集合
查看>>
Spring AOP开发
查看>>
CentOS Docker环境搭建教程
查看>>
EqualsBuilder 类的使用
查看>>
『原创』+『参考』亲手实验:使用C#在PPC中播放声音
查看>>
100层高楼摔2个鸡蛋的问题
查看>>
Linux常用配置
查看>>
Linux压缩那些事儿
查看>>