`
sing100star
  • 浏览: 28577 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

访问历史 的实现

阅读更多

最近访问历史记录的实现,废话不多说,上代码。

 

1、VisitRecord

public class VisitRecord {	
	/**标志**/
	private String id;
	/** 标题 */
	private String title;

	public VisitRecord(){}
	
	public  VisitRecord(String id,String title){
		this.id = id;
		this.title = title;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String toString(){
		 return "id:"+id +"," +  "title:"+title;
	}
	@Override
	public boolean equals(Object obj){
		if (null == obj) return false;
		if (obj.getClass() != getClass()) return false;
		VisitRecord vh = (VisitRecord)obj;
		return id.equals(vh.getId());
	}
	@Override
	public int hashCode(){
		return id.hashCode();
	}
}
 

2、VisitHistory

/**访问历史*/
public class VisitHistory {
	
	public static final Log log = LogFactory.getLog(VisitHistory.class);
	public static final int MAX_RECORD = 5;
	public static final String VISIT_HISTORY_NAME = "visitHistory";
	public static final int LIFE_CYCLE = 15 * 24 *60 * 60;
	
	private Queue<VisitRecord> visitRecords ;
	private Cookie visitRecordCookie;
	
	private VisitHistory(){super();}
	public static VisitHistory newInstance(){
		return new VisitHistory();
	}
	/**
	 * 当访问商品时,触发该函数
	 */
	public void visit(String title, Long commodityId, HttpServletRequest request,HttpServletResponse response ){
		//1、创建一个访问记录
		VisitRecord vh = new VisitRecord(commodityId.toString(),title);
		//2、返回已经存在访问历史
		getVisitRecords(request);
		//3、添加记录
		add(vh);
		//4、保存cookie
		saveVisitRecordToCookie();	
		//5、保存cookie到客户端
		saveCookieToHost(response);
	
	}
	public void saveCookieToHost(HttpServletResponse response){
		response.addCookie(visitRecordCookie);
	}
	/**
	 * 把访问记录保存到Cookie中
	 * @param cookie
	 */
	public  void saveVisitRecordToCookie(){
		JSONArray array =JSONArray.fromObject(visitRecords);
		String encodedString  = toEncodedString(array.toString());
		if(null == visitRecordCookie){
			visitRecordCookie = new Cookie(VISIT_HISTORY_NAME,encodedString);
			visitRecordCookie.setMaxAge(LIFE_CYCLE);
		}else{
			visitRecordCookie.setValue(encodedString);
		}
	}
	/**
	 * 添加历史记录
	 */
	public void add(VisitRecord vh){
		if(visitRecords.contains(vh)) {
			replaceVisitRecord(vh);
		}else{
			addVisitRecord(vh);
		}
	}
	/**
	 * 添加历史纪录
	 */
	public void addVisitRecord(VisitRecord vh){
		if(visitRecords.size()< MAX_RECORD){
			visitRecords.offer(vh);
		}
		else if(visitRecords.size() >= MAX_RECORD){
			visitRecords.poll();
			visitRecords.offer(vh);
		}
	}
	/**
	 * 替换历史记录
	 */
	public void replaceVisitRecord(VisitRecord vh){
			LinkedList<VisitRecord> list = (LinkedList<VisitRecord>)visitRecords;
			int i = list.indexOf(vh);
			list.set(i, vh);
	}
	/**
	 * 返回 访问历史
	 */
	public void getVisitRecords(HttpServletRequest request){
		//变量定义
		visitRecords = new LinkedList<VisitRecord>();
		//判断cookie是否存在,是否记录
		visitRecordCookie = getVisitRecordCookie(request);
		if(null == visitRecordCookie) return ;
		if(!StringUtil.hasText(visitRecordCookie.getValue())) return;
		//获取Arrary
		String jsonStr =(String)visitRecordCookie.getValue();
	    String decodedString = toDecodedString(jsonStr);
		JSONArray array = JSONArray.fromObject(decodedString);
		Iterator iter = array.iterator();
		while(iter.hasNext()){
			visitRecords.offer( (VisitRecord) JSONObject.toBean((JSONObject) iter.next(), VisitRecord.class));
		}	
		
	}
	
	public  Cookie getVisitRecordCookie(HttpServletRequest request){
		 Cookie visitHistoryCookie = null;
		 Cookie[] cookies =request.getCookies();
		 for(Cookie cookie : cookies){
			 if(cookie.getName().equals(VISIT_HISTORY_NAME)){
				 visitHistoryCookie = cookie;
			 }
		 }
		 return visitHistoryCookie;
	}
	
	public  String toEncodedString(String str){
		String encodedString = null;
		try {				
			encodedString = URLEncoder.encode(str,"UTF-8").replace("\r\n", "");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return encodedString;
	}
	
	public  String toDecodedString(String str){
		String decodedString = null;
		
		try{
			  decodedString = URLDecoder.decode(str,"UTF-8");
		}catch(IOException e){
			e.printStackTrace();
		}
		return decodedString;
	}
}
 

3、前台抓取历史记录

var cookie_val = $.cookie("visitHistory");
var history = eval(cookie_val); 

 

4、注意事项

  1. VisitHistoryUtil中最容易出问题的是cookie的保存:1、字符编码问题。2、\r\n的问题。
  2. 由于不同的平台上的编码不一样,特别当代码运行在不同的服务器上,因此采用UTF-8格式,当然jsp网页最好也采用UTF-8格式,这样才能减少出错的概率。
  3. cookies中的每一个cookie是根据\r\n来区别的,每往cookie里增加一条历史记录,要记得先把\r\n去掉。
  4. 由于使用的是json,则所以要用evel转化javascript可识别的代码。
  5. 不要客气,欢迎拍砖
分享到:
评论

相关推荐

    Servlet实现历史记录功能(浏览记录)

    本教程将深入探讨如何使用Servlet实现一个历史记录功能,即浏览记录,让用户能够查看他们之前访问过的页面。 首先,理解Servlet的基本概念是至关重要的。Servlet是一个Java类,遵循Java Servlet API规范,它可以...

    C#访问OpcServer实现读写PLC

    OPC分为OPC DA(数据访问)、OPC HDA(历史数据访问)、OPC Alarms & Events等不同类型。 2. **C#编程**:C#是一种面向对象的编程语言,广泛用于开发Windows应用程序,包括工业自动化领域的应用。其强大的类库和...

    组态王通过外置数据库实现历史曲线修改配置文档

    在本案例中,客户需要实现历史曲线的修改功能,由于实际仪表可能存在故障或不准确,因此提出此需求。组态王自身具备历史数据记录功能,但默认情况下历史曲线是不可修改的。为满足客户需求,可以通过连接外部数据库,...

    获取浏览器访问记录(c++实现)

    总的来说,这个C++项目提供了一个跨平台的解决方案,用于获取主流浏览器的访问历史,通过解析不同浏览器的特定存储格式,实现了数据的提取和显示。开发者可以在此基础上进行扩展,例如添加对其他浏览器的支持,或者...

    C#实现菜单历史列表

    "C#实现菜单历史列表"这个主题涉及到如何在C#应用中设计并实现一个能够记录用户最近访问过的菜单项的功能。 首先,要理解菜单历史列表的基本概念。这是一个功能,它可以存储用户在过去一段时间内选择过的菜单项,...

    OPC历史数据访问服务器结构分析与接口设计.pdf

    #### 开发实现OPC历史数据访问服务器 开发OPC历史数据访问服务器需要对服务器的模型、对象和接口进行深入分析,并定义好自定义接口的功能。通过客户与服务器设计的实例和测试来阐述开发原理和具体实现方法。这涉及...

    C#如何实现菜单历史列表

    在C#编程中,创建一个菜单历史列表是一个常见的需求,特别是在开发桌面应用程序时,用户可能希望看到他们最近访问过的菜单项以便快速访问。这个过程涉及数据存储、UI设计以及事件处理等多个方面。以下是一个详细步骤...

    实现无刷新跟换URL,适用于特定情境的历史返回

    接下来,我们将详细讨论如何利用这些技术实现无刷新更换URL以及特定情境的历史返回。 1. History API: HTML5的History API允许开发者对浏览器的历史记录进行操作,而无需实际加载新的页面。这个API主要包括了`...

    .net通过设置全局文件统计在线人数和历史访问人数

    ### .NET 中通过全局文件统计在线人数与历史访问人数 ...通过以上步骤,我们就可以有效地在.NET应用程序中实现对在线人数和历史访问人数的统计。这种方法简单且易于实现,非常适合中小规模的Web应用。

    清除访问internet历史痕迹

    实现历史记录的全面清除,包括清除Internet临时文件,Cookie的清除,浏览器地址栏历史地址的清除,清除表单自动完成历史记录,清除自动密码历史记录,清除收藏夹中的内容,清除RAS自动拨号历史记录,清除系统临时...

    vc源码 清空PC历史记录

    5. **编程接口(API)**:在清理历史记录和缓存的过程中,可能需要调用操作系统提供的API,例如Windows API,来访问和修改系统设置。 6. **文件操作**:源码可能涉及到读取、遍历和删除特定类型的文件,如浏览历史...

    cookie 实现显示商品的浏览的历史记录

    在这个例子中,“cookie实现显示商品的浏览历史记录”是一个典型的使用Cookie来记录用户浏览过的商品并显示历史记录的应用场景。下面将详细解释这个过程以及涉及的相关技术。 1. **Cookie基础**: - **定义**:...

    C#实现OPC历史数据存取

    通过C#语言实现OPC历史数据的访问,可以有效地集成不同自动化系统产生的历史数据。这种集成不仅有助于企业更好地利用历史数据进行深入分析,还可以提高数据的利用率,从而为企业创造更大的价值。此外,这种方式还...

    MFC实现历史记录的全面清除

    在本案例中,“MFC实现历史记录的全面清除”指的是利用MFC框架编写的一款程序,能够自动清理用户的系统历史记录,包括浏览过的网页、打开过的文件等,以保护用户的隐私。 首先,我们要理解MFC如何与Windows API交互...

    利用会话技术模拟实现网上商城常见的购物车功能和浏览历史功能

    浏览历史记录了用户在过去访问过的商品信息,包括商品ID和访问时间。在用户访问商品详情页时,我们可以将商品ID和当前时间存入会话。为了节省内存,通常只保存最近的N条浏览记录,当新的浏览记录加入时,会话中的...

    基于ADO技术的iFix历史报表的设计与实现

    ### 基于ADO技术的iFix历史报表的设计与实现 #### 1. 引言 iFIX是一款全球领先的HMI/SCADA自动化监控组态软件,在全球范围内有着广泛的应用,尤其是在工业自动化领域。该软件提供了强大的VBA脚本编译器,能够满足...

    如何实现菜单历史列表

    在IT领域,菜单历史列表是一种常见的功能,它允许用户跟踪和访问他们之前浏览过的菜单项。这个功能在各种应用程序和网站中都非常有用,比如文件管理器、操作系统菜单、Web浏览器等。实现这样的功能可以帮助提高用户...

    HttpSessionListener在线人数和历史访问量

    这个接口是Java Servlet API的一部分,通过实现它,开发者可以获取到Web应用中的在线用户数量以及历史访问量的信息。下面将详细介绍如何使用`HttpSessionListener`来实现这些功能。 首先,我们需要创建一个类并实现...

    非常完美Java实现年、月、日、周访问量统计

    为了统计访问量,我们需要一个存储历史数据的数据结构,如`HashMap`,其中键为日期或星期,值为对应的访问量。 以下是一个简单的日访问量统计示例: ```java import java.time.LocalDate; import java.util....

    vc中实现历史记录的全面清除

    对于使用VC(Visual C++)进行开发的项目而言,实现历史记录的全面清除不仅是对用户数据管理的一种必要手段,也是确保应用稳定性和安全性的重要步骤。本文将深入探讨在VC环境中如何实现历史记录的全面清除,包括...

Global site tag (gtag.js) - Google Analytics