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