JavaWeb学习总结第五篇--认识Cookie机制
Cookie机制
前言
会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie和Session。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来记录用户账号以及登陆次数的例子。
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2015/6/17
Time: 11:58
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setCharacterEncoding("UTF-8"); String username = "";
int visitTimes = 0; Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) {
Cookie cookie = cookies[i];
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
} else if ("visitTimes".equals(cookie.getName())) {
visitTimes = Integer.parseInt(cookie.getValue());
}
}
if (username == null || username.trim().equals("")) {
throw new Exception("请先登录");
}
Cookie visitTimesCookie = new Cookie("visitTimes",Integer.toString(++visitTimes));
response.addCookie(visitTimesCookie);
%>
<html>
<head>
<title></title>
</head>
<body>
<div align="center" style="margin:10px; ">
<fieldset>
<legend>登录信息 当前时间:<%= new Date() %></legend>
<form action="login.jsp" method="post">
<table>
<tr>
<td>您的账号: </td>
<td><%= username %></td>
</tr>
<tr>
<td>登录次数: </td>
<td><%= visitTimes %></td>
</tr>
<tr>
<td></td>
<td>
<input type="button" value="刷 新" onclick="location='<%=request.getRequestURI()%>?ts=' + new
Date().getTime(); " class="button">
</td>
</tr>
</table>
</form>
</fieldset>
</div>
</body>
</html>
如果没有找到包含username属性的Cookie,则抛出异常,页面跳转到登陆页面login.jsp。
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2015/6/17
Time: 12:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8"); if ("POST".equals(request.getMethod())) {
Cookie usernameCookie = new Cookie("username",request.getParameter("username"));
Cookie visitTimesCookie = new Cookie("visitTimes","0"); response.addCookie(usernameCookie);
response.addCookie(visitTimesCookie); response.sendRedirect(request.getContextPath() + "/cookie.jsp");
return ;
}
%>
<html>
<head>
<title>请先登录</title>
</head>
<body>
<div align="center" style="margin:10px; ">
<fieldset>
<legend>登录</legend>
<form action="login.jsp" method="post">
<table>
<tr>
<td>账号: </td>
<td><input type="text" name="username" style="width:200px; "></td>
</tr>
<tr>
<td>密码: </td>
<td><input type="password" name="password" style="width:200px; "</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登 录" class="button"</td>
</tr>
</table>
</form>
</fieldset>
</div>
</body>
</html>
另外,Cookie还具有以下一些特点:
- 不可跨域名性,Google和Baidu的Cookie是分开的,各自访问时显示的是各自的Cookie。
- Cookie中保存中文只能编码
- Cookie中可以保存二进制数据,比如使用数字证书
下面的程序使用UTF-8编码了Cookie内容,然后再使用UTF-8解码Cookie并显示出来。
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2015/6/17
Time: 13:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:directive.page import="java.net.URLEncoder"/>
<jsp:directive.page import="java.net.URLDecoder"/>
<%
Cookie cookie = new Cookie(
URLEncoder.encode("姓名","UTF-8"),
URLEncoder.encode("天才白痴梦","UTF-8"));
response.addCookie(cookie);
%>
<html>
<head>
<title>Cookie Encoding</title>
</head>
<body>
<%
if (request.getCookies() != null) {
for (Cookie cc : request.getCookies()) {
String cookieName = URLDecoder.decode(cc.getName(),"UTF-8");
String cookieValue = URLDecoder.decode(cc.getValue(),"UTF-8"); out.println(cookieName + " : " + cookieValue + "; <br/>");
}
}
else {
out.println("Cookie 已经写入客户端,请刷新页面。");
}
%>
</body>
</html>

JavaWeb学习总结第五篇--认识Cookie机制的更多相关文章
- JavaWeb学习总结第六篇--认识Session机制
认识Session机制 前文也提到过,常用的会话跟踪有两种技术:Cookie和Session.今天就为大家讲解一下Session机制. 什么是Session? Session是另一种记录客户状态的机制 ...
- RabbitMQ学习总结 第五篇:路由Routing
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- JavaWeb学习笔记总结 目录篇
JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...
- Egret入门学习日记 --- 第五篇(书中 3.5节 内容)
第五篇(书中 3.5节 内容) 今天得把昨天的问题解决了才行. 去了Q群,碰到一位大大,他给我解惑了.Thanks♪(・ω・)ノ 这是我之前按照书上写的方式写的,并没有效果. 然后大大给我解答了: 后 ...
- JavaWeb学习总结第三篇--走进JSP页面元素
JavaWeb学习(三)—走进JSP页面元素 JSP:Java Server Pages,译为Java服务器页面.其脚本采用Java语言,继承了Java所有优点.JSP元素可以分为指令元素.脚本元素和 ...
- Django学习笔记第五篇--实战练习一--查询数据库并操作cookie
一.启动项目: django-admin start mysite1 cd mysite1 python manage.py startapp loginapp 根据上文敲命令就可以创建好了一个项目结 ...
- JavaWeb学习总结(九):Cookie进行会话管理
一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...
- Python学习【第五篇】:面向对象及相关
面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 c ...
- javaweb学习总结(十五)——JSP基础语法
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
随机推荐
- SQL使用链接服务器执行远程数据库上的存储过程
原文:SQL使用链接服务器执行远程数据库上的存储过程 --创建链接服务器 exec sp_addlinkedserver'server_tmp','','SQLOLEDB','远程服务器名或ip地址' ...
- 【ASP.NET】 中 system.math 函数使用
1 /* 字段 */ 2 Math.E; //2.71828182845905 3 Math.PI; //3.14159265358979 4 5 /* 静态方法 */ 6 Math.Abs; //绝 ...
- Ubuntu system zabbix-server-3.x install documentation
Installing repository configuration package wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/ ...
- ASP.NET MVC4网站部署在阿里ECS云服务器(WIndows Server 2012+IIS8环境)
首先交代一下服务器的环境配置 系统是WIndows Server2012(配置的时候选的是全能环境),服务器是IIS8 由于装了VS2012,所以系统也自动装上了.Net Framework4.5,M ...
- zabbix分组报警
生产上需要在出现报警情况下,不同的主机发送报警给不同的用户 下面实例为分组为dev(开发组)和ops(运维组) 1.把主机进行分组 创建主机群组 配置-->主机群组-->创建主机群组,创建 ...
- MySQL时间增加、字符串拼接
MySQL时间增加.字符串拼接 SELECT DATE_ADD(startTime, INTERVAL 10 SECOND); CONCAT(string1,string2,…)
- [Debug] Diagnose a Slow Page Using Developer Tools
Your page is showing high CPU usage and spinning up your laptop fan, but nothing is visibly happenin ...
- Unity3D 中脚本执行的先后顺序
Unity3D本身自带有控制脚本执行先后顺序的方法: Edit ---> Project Settings ---> Script Execution Order ---> 值越小 ...
- java web中 classpath路径 详解
在使用ssh等框架开发web程序时配置文件(xml和properties)存放的路径一般为src下,当部署程序时则必须存在于classes路径下,具体如下 src不是classpath, WEB-IN ...
- python 搭建环境
直接命令行里面 1.进入相应的目录 ,然后python,然后python setup.py 2.或者直接python C:\Python27\Lib\site-packages\xlrd-0.9.3\ ...