Cookie案例分析
一、案例- 显示用户上次访问的时间
当用户第一次访问该页面的时候提示:你好,你是第一次访问本页面,当前时间为:2016-11-3 22:10:30
第n次访问该页面时:欢迎回来,你上次访问的时间是:2016-11-3 22:10:30,当前时间是:2016-11-3 22:10:30
示例代码:
package com.gqx.cookie; import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Test extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取当前时间
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time =format.format(new Date());
Cookie cookie =new Cookie("lastTime", time);
cookie.setPath("/CookieSession");
cookie.setMaxAge(1*30*24*60*60);
response.addCookie(cookie); Cookie[] cookies=request.getCookies();
if (cookies!=null) {
response.getWriter().write("<html><body><p>欢迎回来,你上次访问的时间是:"+cookies[0].getValue()+" "+"当前时间是:"+time+"</p></body></html>");
cookie.setValue(time);
cookie.setMaxAge(1*30*24*60*60);
response.addCookie(cookie);
}else {
response.getWriter().write("<html><body><p>你是首次访问本网站,当前时间是:"+time+"</p></body></html>");
}
} }
二:案例-查看用户浏览器过的商品
要实现浏览记录,同时将最近浏览的商品浏览最近时间排好顺序,同时只要求显示三条记录
思路:由于要求不易实现,逻辑不易理清,我们先建一个web项目,然后建立好分包目录
首先我们建立实体对象,即产品对象,对其进行封装
package com.gqx.entity; public class Product {
private String id;
private String name;
private float price;
private String proType;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getProType() {
return proType;
}
public void setProType(String proType) {
this.proType = proType;
} public Product() {
super();
// TODO Auto-generated constructor stub
}
public Product(String id, String name, float price, String proType) {
super();
this.id = id;
this.name = name;
this.price = price;
this.proType = proType;
}
@Override
public String toString() {
return "Product [id=" + id + ", name=" + name + ", price=" + price
+ ", proType=" + proType + "]";
} }
然后定义好一个数据访问对象的操作方法的类,里面有我们需要对对象操作的全部方法
package com.gqx.productDao; import java.util.ArrayList;
import java.util.List; import com.gqx.entity.Product; /**
*该类存放对product的相关操作,如查询、(CRDU)
* @author Administrator
*
*/
public class ProductDao {
//模拟数据库存放所有商品
private static List<Product> products=new ArrayList<Product>();
//初始化所有产品,用静态代码块完成,只执行一次
static{
for (int i = 1; i < 11; i++) {
products.add(new Product("00"+i, "笔记本"+i, 4500+i*100, "厂商"+i));
}
} //提供查询所有商品的方法
public List<Product> findAll(){
return this.products;
} //根据id去查询某产品
public Product getProduct(String id){
for (Product product:products) {
if (product.getId().equals(id)) {
return product;
}
}
return null;
} }
最后就是我们要访问的servlet了,本案例的重点也在此处
package com.gqxservlet; import java.io.IOException;
import java.io.PrintWriter;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.gqx.entity.Product;
import com.gqx.productDao.ProductDao; public class ListServlet extends HttpServlet { /**
* 首页:查询所有商品的servlet
*/
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
//查询“数据库”,读出所有的商品。
ProductDao dao=new ProductDao(); //对操作对象的实例化
List<Product> products=dao.findAll(); PrintWriter out = response.getWriter(); //把所有的产品显示到浏览器中
String html="";
html+="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"><HTML><HEAD><TITLE>所有商品列表</TITLE></HEAD><BODY>";
html+="<table width='600px' border='1' align='center'>";
html+="<tr><th>编号</th><th>商品名称</th><th>商品类型</th></tr>";
//遍历所有的商品
for(Product product:products){
String path=request.getContextPath()+"/DetailServlet?id="+product.getId();
html+="<tr><td>"+product.getId()+"</td><td>"+product.getName()+"</td><td><a href='"+path+"'>详细信息</a></td></tr>";
}
html+=" </table>"; //处理上一次访问的cookie,得到上一次啊访问的数据
String str="</br>";
Cookie[] cookies=request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("proHist")) {
str+="你上次浏览的商品是:</br>";
String proHist=cookie.getValue();
String[] ids=proHist.split(",");
for (String string : ids) {
//查询“数据库”,查询对于的商品
Product p=dao.getProduct(string);
//显示在浏览器上
str+=p.getId()+" "+p.getName()+" "+p.getPrice()+"</br>";
}
}
}
}else {
str+="<p>你是第一次访问本网站</p>";
} html=html+str;
html+="</BODY></HTML>";
out.write(html);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }
然后我们来定义内容页,该页记录着cookie,同时对cookie进行更改,然后将其发送给服务器。
package com.gqxservlet; import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.gqx.entity.Product;
import com.gqx.productDao.ProductDao; public class DetailServlet extends HttpServlet { /**
* 商品详细信息页面
*/
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
ProductDao products=new ProductDao();
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>商品详细信息</TITLE></HEAD>");
out.println(" <BODY>");
String id=request.getParameter("id");
Product product=products.getProduct(id);
//打印出具体的商品信息
String html="";
html+="<table width='300px' border='1' align='center'>";
html+="<tr><th>"+product.getId()+"产品的信息</th></tr>";
html+="<tr><td>商品编号:</td><td>"+product.getId()+"</td><tr><td>商品名称:</td><td>"+product.getName()+"</td></tr><tr><td>商品类型</td><td>"+product.getProType()+"</td></tr><tr><td>商品价格:</td><td>"+product.getPrice()+"</td></tr>";
html+="<center><a href='"+request.getContextPath()+"/ListServlet'>返回上一级</a></center>";
out.print(html);
out.println(" </table>"); //设置cookie值
Cookie cookie =new Cookie("proHist", createValue(request,id));
cookie.setMaxAge(30*24*60*60);
response.addCookie(cookie);
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
} /**
* 显示以前访问的商品,如何保存其cookie值
* @param request
* @return
* 当前cookie 传入 id 最终的cookie
* 无 1 1
* 1 2 2,1
* 2,1 1 1,2
* 1,2 3 3,1,2
*/ private String createValue(HttpServletRequest request,String id) {
// TODO Auto-generated method stub
Cookie[] cookies=request.getCookies();
String proHist=null; if (cookies!=null) {
//如果浏览器端有cookie,则从其中取回cookie值
for (Cookie cookie : cookies) {
//查找名为proHist的cookie
if (cookie.getName().equals("proHist")) {
proHist=cookie.getValue();
}
}
} //如果cookie为空或者proHist为空,则返回当前id
if (cookies==null || proHist==null) {
return id;
} /**
* 剩下的则是对字符串中的cookie值(形如[1,2,3])进行操作,但对仅仅对字符串操作太过于麻烦
* 这个时候我们可以换一种思维,将其转化为集合的形式 在jdk中有一个方法直接将字符串数组转化为list的形式
* static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表。
* 同时Collection又是List的子接口
*/
String string[]=proHist.split(",");
Collection<String> collection = Arrays.asList(string); /**
* 这个时候我们又发现了一个问题,即便是集合,但是对集合的频繁操作太过于麻烦,而且集合缺少一些方便删除添加的操作
* 我们知道对列表的频繁操作,最方便的是linkedlist链接,我们又发现在jdk中有如下的方法,可以方便我们查找
* LinkedList(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列
*/ LinkedList list=new LinkedList(collection); if (list.size()<3) {
//首先判断该cookie值是否超过三个
if (list.contains(id)) {
//当cookie值中重复 (id=1 cookie=2,1)
list.remove(id);
list.addFirst(id);
}else {
list.addFirst(id);
}
}else {
//其次判断该cookie值若超过三个
if (list.contains(id)) {
//当cookie值中重复 (id=1 cookie=2,1,3)
list.remove(id);
list.addFirst(id);
}else {
//不重复,去掉最后一个,将id加到第一个去
list.removeLast();
list.addFirst(id);
}
} //将集合转化为字符串
String valueString="";
for (Object object : list) {
valueString+=object+",";
} //去掉多余的逗号
valueString=valueString.substring(0, valueString.length()-1);
return valueString;
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }
以上将字符做的操作十分的值得借鉴,其中linkedList是一个功能很强大的链表对象,而Collection又是一个不错的方法去将字符串数组转化为集合。
String string[]=proHist.split(",");
Collection<String> collection = Arrays.asList(string);
Cookie案例分析的更多相关文章
- 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析
使用 AppScan 进行扫描 针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan).执行(Do).检查(check).分析(Ana ...
- ENode框架Conference案例分析系列之 - 文章索引
ENode框架Conference案例分析系列之 - 业务简介 ENode框架Conference案例分析系列之 - 上下文划分和领域建模 ENode框架Conference案例分析系列之 - 架构设 ...
- SQL性能优化案例分析
这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...
- CSS3-3D制作案例分析实战
一.前言 上一节,介绍了基础的CSS3 3D动画原理实现,也举了一个小小的例子来演示,但是有朋友跟我私信说想看看一些关于CSS3 3D的实例,所以在这里为了满足一下大家的需求,同时也为了以后能够更好的 ...
- 实时控制软件设计第一周作业-汽车ABS软件系统案例分析
汽车ABS软件系统案例分析 ABS 通过控制作用于车轮制动分泵上的制动管路压力,使汽车在紧急刹车时车轮不会抱死,这样就能使汽车在紧急制动时仍能保持较好的方向稳定性. ABS系统一般是在普通制动系统基础 ...
- 个人作业-Week2 案例分析
微软必应词典客户端的案例分析 第一部分 调研,评测 1)bug: 运行平台:iOS 10.0.2 必应词典版本:4.2.2 1. bug标题:词库加载错误 bug详细描述:学习界面中的经典词库出国考试 ...
- 【MySQL】排序原理与案例分析
前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...
- 个人作业-Week2:案例分析
截止时间:2016年9月25日24:00. 很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课? 都不对, 软件工程有 ...
- ORA-04031错误导致宕机案例分析
今天遇到一起ORACLE数据库宕机案例,下面是对这起数据库宕机案例的原因进行分析.解读.分析过程中顺便记录一下这个案例的前因后果,攒点经验值,培养一下分析.解决问题的能力. 案例环境: 操作系统 ...
随机推荐
- Windows下MySQL数据库备份脚本(一)
说明: MySQL数据库安装目录:C:\Program Files\MySQL\MySQL Server 5.0 MySQL数据库存放目录:C:\Program Files\MySQL\MySQL S ...
- js带缩略图的图片切换效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C# string LastIndexOf()
IndexOf(“FindText",start,len) 中的Start和Len是从左往右数的 LastIndexOf(“FindText",start,len)中的则是从右往左 ...
- 用 OUTLOOK VBA 生成 自定义文件夹 邮件列表
Option Explicit Sub TestFolder() 'Dim outlookapp, myitem, myfolder 'Dim mailcounts As Integer ' ' 'S ...
- Steam游戏黑屏与游戏直接安装方法
黑屏原因主要是360禁止了反作弊进程,解决方法: Steam游戏目录: Steam\steamapps\common\*** 例如黎明杀机,备份时候可直接备份该目录下 Dead by Daylight ...
- Struts, Namespace用法
最近在用SSH框架做一个项目,在使用Struts 的namespace时遇到不少问题,现在就对struts namespace 做一个简单的介绍吧.(本文从项目结构展开叙述) (第1次写博客, 写的不 ...
- js获取域名的方法
本文实例讲述了js获取域名的方法.分享给大家供大家参考.具体实现方法如下: 复制代码代码如下: <script>//获取域名var k_host = window.location.hos ...
- 3G? 2G? 2.5G? 4G? 与 WIFI, GPRS,CDMA 3G无线上网
首先说说无线上网有哪几种形式? WIFI, GPRS, CDMA 3G无线上网 1>wifi全称wireless fidelity,是当今使用最广的一种无线网络传输技术.实际上就是把有线网络信号 ...
- 使用 .NET 平台,如何玩转 Universal Windows 应用?
2015年7月30日 本文作者是 Managed Languages 团队项目经理 Lucian Wischik. 不久前,Visual Studio 2015上新增 Windows 10 应用的开发 ...
- windows远程桌面连接配置
我的电脑 -> 属性 -> 远程 把两个checkbox勾上 运行(win + r) -> 输入secpol.msc回车 -> 找到本地策略 -> 安全选项 ->账 ...