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数据库宕机案例,下面是对这起数据库宕机案例的原因进行分析.解读.分析过程中顺便记录一下这个案例的前因后果,攒点经验值,培养一下分析.解决问题的能力. 案例环境: 操作系统 ...
随机推荐
- 基于ARM-LINUX的温度传感器驱动(DS18B20) .
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等.主要根据应用场合的不同而改变其外观.封装 ...
- python 面向对象 class 老男孩选课系统
要求:1. 创建北京.上海 2 所学校 class2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含,周期,价格,通过学校创建课 ...
- Python全栈开发之 Mysql (一)
一: 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库别说我们在写程序的时候创建的database就是一个数据库 2.什么是 MySQL.Oracle.SQLi ...
- 面试题:实现LRUCache::Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- 【web安全】第五弹:burpsuite proxy模块的一些理解
作为一只小小小白的安全新手,只会简单的用sqlmap扫扫网站,用burpsuite的proxy模块拦截一些请求.最近又对proxy有点儿小理解,记录之. 1. 查看sqlmap注入的语句以及HTTP ...
- NET SqlClient
NET SqlClient的使用与常见问题 阅读目录 一.简介 二.使用ADO.NET 三.常见问题 回到目录 一.简介 在很多要求性能的项目中,我们都要使用传统的ADO.NET的方式来完成我们日常的 ...
- 预处理命令#define #undef #if #endif 的基本用法
C#的预处理命令其实还是蛮有用的,但是真正使用过得人不多,这个介绍一下平时用的比较多的预处理命令中的几个:#define,#undef ,#if,#endif.除此之外还有一些预处理命令#warnin ...
- 关于BootStrap下图标的显示问题
我现在在做自己的毕业设计,用到了bootstrap的这一套css样式,说句心里话,这一套东西确实很好用,但是一个小问题足足浪费了我将近两个小时. 我的问题是:没有办法使用bootstrap下的图标(很 ...
- 系统调用与API的区别
整理自系统调用与API的区别 1.为什么用户程序不能直接访问系统内核模式提供的服务? 答:在linux中,将程序的运行空间分为内核与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,因此用户程 ...
- 【网络流24题】No.4 魔术球问题 (二分+最小路径覆盖)
[题意] 假设有 n 根柱子, 现要按下述规则在这 n 根柱子中依次放入编号为 1, 2, 3, ¼的球.( 1)每次只能在某根柱子的最上面放球.( 2)在同一根柱子中,任何 2 个相邻球的编号之和为 ...