`
sing100star
  • 浏览: 29059 次
  • 性别: 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. 不要客气,欢迎拍砖
分享到:
评论
Global site tag (gtag.js) - Google Analytics