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内容称之 ...
随机推荐
- 在前端页面调用sevlet的路径
1.路径:相对路径和绝对路径 <!-- 使用相对路径访问Servletpath --> <a href="servlet/ServletPath">这是Se ...
- POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 16178 Accepted: 526 ...
- JAVA 线程池以及其他
http://www.cnblogs.com/dolphin0520/ http://www.cnblogs.com/absfree/category/801869.html
- Delphi CRC16校验算法实现(转)
循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随 ...
- Tiny4412在Ubuntu下给MiniTools添加快捷方式
解压MiniTools-Linux-20140317.tgz root@ubuntu:~/tiny4412/MiniTools-# ls -l total -rw-r--r-- root root M ...
- andriod 读取通讯录
package com.example.yanlei.wifi; import android.content.ContentResolver;import android.database.Curs ...
- Ubuntu 16.04 -- 同时配置Nginx(转发)和frp(内网映射)和HTTPS(ca加密) - 端口转发
Ubuntu16.04下: sudo apt -get nginx 用这条命令安装完nginx之后, nginx在该目录下: 然后配置nginx: 如下: 红圈圈住的地方多写几个可以做负载均衡. 端口 ...
- python+ubuntu+selenium安装chrome和chromedriver
请确保selenium已经安装成功,没安装的可以pip install selenium 安装chrome 在终端输入 下载安装包 wget https://dl.google.com/linux/d ...
- 【Hive】Hive 安装&使用基础
2 安装 2.1 参考 2.1.1 下载 2.1.1.1 https://mirrors.tuna.tsinghua.edu.cn/apache/hive/stable-2/ 2.1.2 安装指导 2 ...
- PHP Warning: 的解决方法
在后台管理,用header("location:");做返回时,总是不能正常返回, Warning: Cannot modify header information - head ...