Cookie案例分析

Posted 晓乎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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案例分析的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript单行代码,也就是代码片段

XSS:如何从 C# 中的字符串中删除 JS 片段?

Cookie案例-显示用户的上次访问时间代码实现

Cookie和Session的工作流程及区别(附代码案例)

cookie分析

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段