Cookie和Session的使用及其案例分析

会话
会话技术可以理解为:用户开启一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭会话浏览器,整个过程称为会话。
注意点:每个用户和服务器进行交流的时候各自有一些数据,程序员要想办法保存每个用户的数据

Cookie技术
Cookie是客户端技术,程序把每个用户的数据以Cookie的形式写给各自的服务器,当用户使用这些浏览器去访问服务器端的web资源的时候,就是带着各自的数据去的,这样,web资源处理的数据就是各自的数据了

举例:
判断用户是不是第一次访问
如果是第一次访问,需要输出欢迎,并且记录当前的时间,保存到cookie中,再写入到浏览器端
如果不是第一次访问,获取cookie中的时间,输出时间,并且记录当前的时间,保持在cookie中,再回写到浏览器端

 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 1.获取所有的cookie,判断是不是第一次访问* 2.如果是第一次访问,输出欢迎,记录当前的时间,回写到浏览器端* 3.如果不是第一次访问,获取时间,输出到浏览器上,记录当前的时间,回写到浏览器上*///设置中文乱码问题的处理response.setContentType("text/html;charset=utf-8");//获取所有的cookieCookie[] cookies = request.getCookies();//通过指定的cookie名称来查找cookieCookie cookie = MyCookieUtil.getCookieByName(cookies,"last");//如果cookie==null,说明第一次访问if (cookie == null) {//输出欢迎,记录当前的时间,回写到浏览器上response.getWriter().write("<h1>亲,欢迎下次光临哟</h>");} else {//获取cookie的值,输出浏览器,记录当前的时间,回写到浏览器String value = cookie.getValue();response.getWriter().write("<h1>亲,您又来了,您上次访问的时间是"+value+"</h1>");}//记录当前的时间,回写到浏览器Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String sDate = sdf.format(date);//回写到浏览器//回写cookieCookie c = new Cookie("last",sDate);//设置有效时间,即可以设置访问的时间,可以在下次访问的时候保存其账号和密码信息c.setMaxAge(60 * 60);//设置有效路径  默认的路径就是和servlet的路径相同的.但是你可以通过对数据的改变来完成目的c.setPath("/day_11");//回写response.addCookie(c);    }

实现结果为

cookie细节
1.一个cookie只能标识一种信息,它至少含有一个标识该信息的名称和设置值
2.一个web站点可以给多个web浏览器发送多个Cookie,一个浏览器也可以存储多个web站点提供的Cookie
3.如果创建了一个cookie,并将他发送到浏览器上,默认她是一个会话级别的cookie(存储在浏览器的内存中),用户推出浏览器即被删除

Cookie的使用
编写商品信息列表,给每一个商品起唯一的id值,通过id传值
判断是不是第一次访问
如果不是第一次访问,获取cookie中的商品信息,但是需要判断cookie是否可以包含该商品,如果包含就不用处理,如果不包含,就取出来做累加操作
重定向到商品页面,把商品循环到列表页面
业务流程图如下所示:

代码体现

public class ProductServlet extends HttpServlet {private static final long serialVersionUID = 4859762620036854202L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 1.获取请求参数* 2.获取cookie的数组,通过指定的明名称来查找cookie* 3.如果cookie等于null 则第一次访问*     *如果是第一次访问,创建cookie,回写到浏览器上* 4.如果不是cookie不等于null 不是第一次访问*     *如果不是第一次访问,说明我的cookie中已经存在id*          *判断当前的id是否已经在cookie的value中*          *如果存在,则不用操作*          *如果不存在,在后面追加(product=1,2)* 5.重定向商品列表*///获取请求参数:存到cookie中String id = request.getParameter("id");//先获取所有的cookie,查找指定名称的cookieCookie[] cookies = request.getCookies();//查找指定名称的cookie   从数组中查询指定名称的cookieCookie cookie = MyCookieUtil.getCookieByName(cookies, "product");if (cookie == null) {//如果cookie==null,第一次访问,创建cookie,回写Cookie c = new Cookie("product", id);//回写response.addCookie(c);} else {//如果不是第一次访问//获取cookie的value(value可能是1,2,3,4,5,6)String value = cookie.getName();//判断当前的id是否包含在value中String[] values = value.split(",");if(!checkId(values,id)){//不包含cookie.setValue(value+","+id);//回写response.addCookie(cookie);}}//重定向到商品页面response.sendRedirect("/day_11/cookie/productList.jsp");}//服务器端页面
<%@page import="cn.ujiuye.utils.MyCookieUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>购物车页面</title><style type="text/css">.img1{width:160px;height:140px;}
</style></head>
<body><img  class="img1" src="/day_11/img/1.jpg"><a href="/day_11/product?id=1">手电筒</a><img  class="img1" src="/day_11/img/2.jpg"><a href="/day_11/product?id=2">电话</a><img  class="img1" src="/day_11/img/3.jpg"><a href="/day_11/product?id=3">电视机</a><br/><img  class="img1" src="/day_11/img/4.jpg"><a href="/day_11/product?id=4">冰箱</a><img  class="img1" src="/day_11/img/5.jpg"><a href="/day_11/product?id=5">手表</a><img  class="img1" src="/day_11/img/6.jpg"><a href="/day_11/product?id=6">电脑</a><h1>浏览记录</h1><%//获取cookie中的value值  循环遍历Cookie[] cookies = request.getCookies();//查询指定名称的cookieCookie cookie = MyCookieUtil.getCookieByName(cookies, "product");//如果cookie不为空,拿到值,遍历if(cookie != null){//获取值 1 2 3 String value = cookie.getValue(); //分割String[] ids = value.split(",");//循环遍历,获取idfor(String id : ids){%><img  src="/day_11/img/<%= id %>.jpg"><br>
<%      }}%></body>
</html>

具体效果


session
在web开发的时候,服务器可以给每个浏览器创建一个会话对象,注意一个浏览器独占一个session对象,因此要保持数据的时候,服务器可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其他程序的时候,其他程序可以从用户的session取出该用户的数据为用户服务
Session和Cookie的区别
Cookie是把用户的数据写到用户的浏览器上
Session技术把用户的数据写到独享的Session中
Session是由服务器创建,开发人员可以使用reqest对象的getSession方法获取Sesssion对象

session案例
使用Session完成简单的购物车功能
1.接受传递过来的商品的id
2.使用Map集合代码购物车(key商品名称,value商品数量)
3.从session中获取购物车
4.把购物车存到Session中

public class CartServlet extends HttpServlet {private static final long serialVersionUID = -2683239594750700474L;@SuppressWarnings("unchecked")public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 需求分析* 1.购物车 Map<String,Integer> cart    把购物车存到session中* 2.获取购物车,判断是不是第一次访问*     *第一次访问:创建购物车,把商品的名称和数量放到购物车里,再存到session中*     *不是第一次访问*          *判断是否包含该商品,通过名称*              *如果包含,数量加1存到session中*              *如果不包含,存入购物车,存到session*  3.继续购物或者去结算            *///获取参数String id = request.getParameter("id");//购物车中存入商品的信息和数量String[] names = {"电脑","手机","平板","电扇","空调"}; //把id翻译成名称int index = Integer.parseInt(id);//商品的名称String name = names[index - 1];//从session中获取购物车,必须先获取sessionHttpSession session = request.getSession();//从session中获取购物车Map<String, Integer> cart  =  (Map<String, Integer>) session.getAttribute("cart");//通过cart进行判断,是否是第一次访问if (cart == null) {//创建一个购物车cart = new HashMap<String, Integer>();//第一次访问cart.put(name, 1);//存入到session中去session.setAttribute("cart", cart);} else {//不是第一次访问,判断是否包含该商品if (cart.containsKey(name)) {//取出数量,+1,存入购物车,存入session//取出Integer count = cart.get(name);count++;cart.put(name, count);//存入到session中session.setAttribute("cart", cart);}else {//不包含cart.put(name, 1);//存入到session中session.setAttribute("cart", cart);}}//继续购物或者结算response.setContentType("text/html;charset=utf-8");response.getWriter().write("<h2><a href='/day_11/session/cartList.jsp'>继续购物</a> | <a href='/day_11/session/pay.jsp'>清空购物车</a></h2>");}
//浏览器端代码
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>购物车</title>
</head>
<body><h2>电脑<a href="/day_11/cart?id=1">加入购物车</a></h2><h2>手机<a href="/day_11/cart?id=2">加入购物车</a></h2><h2>平板<a href="/day_11/cart?id=3">加入购物车</a></h2><h2>电扇<a href="/day_11/cart?id=4">加入购物车</a></h2><h2>空调<a href="/day_11/cart?id=5">加入购物车</a></h2></body>
</html>



session案例一次性校验码
1.一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码

2.服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程

3.密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程

public class LoginServlet extends HttpServlet {private static final long serialVersionUID = -1530508632256373495L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//处理post表单提交的中文乱码问题request.setCharacterEncoding("UTF-8");//获取session中的验证码String code1 = (String) request.getSession().getAttribute("code");//获取表单中的验证码String code2 = request.getParameter("code");//是否相同if (code2 != null && code1.equals(code2)) {response.getWriter().write("success");}else {//如果不相同,则返回错误信息//转发request.setAttribute("msg", "验证码输入错误");request.getRequestDispatcher("/session/login.jsp").forward(request, response);}}浏览器端页面
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>${msg}<form action="/day_11/login" method="post"><table border="1"><tr><td>输入账号:</td><td><input type="text" name="username"></td></tr><tr><td>输入账号:</td><td><input type="password" name="password"></td></tr><tr><td>验证码</td><td><input type="text" name="code"><img id="imgId" src="/day_11/checkCode"><a href="#" onclick="run()" >看不清,换一张</a></td></tr><tr align="center"><td colspan="2"><input type="submit" value="登录"></td></tr></table></form></body>
<script type="text/javascript">//看不清,换一张function run(){//加载图片  加上一个时间戳,保证每一次请求都是一个新的请求var image = document.getElementById("imgId");image.src="/day_11/checkCode?"+new Date().getTime();}</script>
</html><%@page import="java.util.Set"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>结算界面</title>
</head>
<body><h2>结算界面</h2><%//获取购物车,把购物车中的商品信息和数量显示在页面上Map<String,Integer> cart = (Map<String,Integer>)request.getSession().getAttribute("cart");//如果购物车不为空,循环遍历if(cart != null){//循环遍历Set<String> keys = cart.keySet();//循环遍历,拿到商品的名称for(String key: keys){
%><h3>亲,您购买的商品是<%= key %>,数量是<%= cart.get(key) %></h3>
<%      }} else{
%><h3>亲,您还没有购物呢,你赶紧去<a href="/day_11/session/cartList.jsp">购物吧</a></h3>
<%      }%>
</body>
</html>

运行结果

以上就是鄙人对Cookie和Session的拙见,欢迎大家批评指定

Cookie和Session的使用及其案例分析相关推荐

  1. 案例分析:session丢失及appdomain回收

    原文地址:http://blogs.msdn.com/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-app ...

  2. php禁用cookie后session设置方法分析

    本文实例讲述了php禁用cookie后session设置方法.分享给大家供大家参考,具体如下: 我们都知道当在session会话有基于cookie和基于url两种传递SESSIONID的方法.为了实现 ...

  3. 关于cookie的文章(cookie与session机制)

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  4. Django 的cookie 与 session组件

    Cookie概述 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中 ...

  5. 一问带你区分清楚Authentication,Authorization以及Cookie、Session、Token

    很多人可能对权限认证领域一些常见的概念都不是特别了解,所以写了篇文章专门介绍一下这些概念. 1. 认证 (Authentication) 和授权 (Authorization)的区别是什么? 这是一个 ...

  6. 7,复习,多对多表的三种创建,form组件,cookie,session

    昨日内容回顾  choices字段   只要是能够罗列出来的有限个选项的都可以使用choices字段来做    1.学历,工作经历,性别,工作状态,客户来源,婚嫁    gender_choices ...

  7. 阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章

    阅读<大型网站技术架构:核心原理与案例分析>第五.六.七章,结合我们的系统,分析如何增加相应的功能,提高系统的可用性和易用性. 这三章主要讲述的是网站的可用性.伸缩性和可扩展性. 高可用架 ...

  8. Cookie 和 Session机制具体解释

    原文地址:http://blog.csdn.net/fangaoxin/article/details/6952954     会话(Session)跟踪是Web程序中经常使用的技术.用来跟踪用户的整 ...

  9. Cookie和Session的详细介绍和使用规范

           Cookie和Session的详细介绍和使用规范 Cookie的由来(浏览器端的会话技术--保存数据技术) Cookie的需求分析 场景: 现象:进入淘宝的登陆页面,显示了我上次登录的用 ...

  10. MySQL、JDBC、HTML、CSS、JavaScript、jQuery、tomcat、Http、Servlet、JSP、EL、JSTL、Maven、Cookie、Session(框架第一部分)

    第一章 MySQL 一 .数据库 1.什么是数据库? 所谓的数据库就是指存储和管理数据的仓库 2.数据库有哪些分类? 3.什么是关系型数据库? 底层以二维表的形式保存数据的库就是关系型数据库 stu- ...

最新文章

  1. ios开发判断字符串为空_【开发常识】这个问题,直接导致年终奖没了……(惨兮兮)...
  2. sqlite3命令大全
  3. mysql生活应用_MySQL应用
  4. AIR 窗口,自定义形状窗口,按钮
  5. STM8 ADC转换模式-------带缓存的连续模式
  6. 使用计算机控制台方法,故障控制台使用方法
  7. Java学习之向上、下转型
  8. 【NOIP2005】【Luogu1046】陶陶摘苹果
  9. selenium定位不到元素的原因。
  10. 再造轮子之网易彩票-第一季(IOS 篇 by sixleaves)
  11. 想要转人工智能,程序员该如何学习?
  12. win7系统efi激活教程:无需efi win7激活工具解决无法分配盘符问题
  13. 为什么手机里的小爱音响app里搜不到家里的小爱音箱_小爱触屏音箱体验:小爱同学有了屏幕增加功能,是不是你的菜?...
  14. 【Python 笔记】Linux 下源码编译安装 python
  15. 【T+】畅捷通T+往来单位档案中默认票据类型设置为“必录”
  16. spark ui job和stage的dag图查看过去运行的任务,查不到,分析源码解决问题
  17. 人民的名义1-55集全 已看完(观后感)
  18. openoffice java awt_使用openoffice转pdf,详细
  19. ITSS服务项目经理 IT服务工程师 培训 证书延续
  20. matlab如何求矩阵特征值

热门文章

  1. 23岁的Python,这些年在编程语言排行榜上直线上升的原因是什么?很多人都不解
  2. invalid characters encountered in Hex string
  3. Logo创作灵魂(下篇)
  4. ps-通道实现故障色彩效果
  5. python网页搜索脚本_bing搜索引擎子域名收集(Python脚本)
  6. servlet基础:Servlet、ServletConfig、ServletContext
  7. HAU寒假训练第一周
  8. 赵小楼《天道》《遥远的救世主》深度解析(140) ‘初恋’就是‘不可思议’的爱情。当你意识到‘它’的时候,它已经只存在‘回忆’里。
  9. python多线程爬取qq好友空间的留言
  10. 网站Banner的代码