package cn.itcast;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 类说明:使用cookie实现浏览历史记录
*
* @author 作者: LiuJunGuang
* @version 创建时间:2011-10-31 下午04:16:02
*/
public class CookieUtils {
/**
* Cookie的名字
*/
public static final String COOKIE_HISTORYID = "cookies_history";
/**
* Cookie的存活时间
*/
public static final int COOKIE_LIFE_TIME = 14 * 24 * 60 * 60;
/**
* 最大的浏览历史记录条数
*/
public static final int HISTORY_COUNT = 5;
/**
* 获得指定cookie中的值
*
* @param request
* @param cookieName
* 要查找的cookie的名字
* @return 返回指定Cookie中的字符串值
*/
public static String getCookie(HttpServletRequest request, String cookieName) {
Cookie cookies[] = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
// 找到指定的cookie
if (cookie != null && COOKIE_HISTORYID.equals(cookie.getName())) {
return cookie.getValue();
}
}
}
return null;
}
/**
* 设置指定cookie中的值(1.得到原先cookie中的值;2.重新设置cookie的值;3.保存重置后的cookie)
*
* @param request
* @param response
* @param cookieName
* 要设置的cookie的名字
* @param goodsid
* 要添加到浏览历史中的 goodsID号
* @param count
* 总共可以显示的历史记录条数
*/
public static void setCookie(HttpServletRequest request,
HttpServletResponse response, String cookieName, String goodsid,
int count) {
// 得到指定的cookie
String ids = getCookie(request, cookieName);
// 设置cookie中格的浏览记录
ids = setValue(ids, goodsid, count);
// 保存cookie
saveCookie(request, response, cookieName, ids);
}
// 测试方法
public static void main(String[] args) {
System.out.println(setValue(null, "1", 3));
System.out.println(setValue("1,2,3", "1", 3));
System.out.println(setValue("2,1,3", "1", 3));
System.out.println(setValue("2,1", "1", 3));
System.out.println(setValue("2,3,4", "1", 3));
System.out.println(setValue("2,4", "1", 3));
System.out.println(setValue("4,3,1", "1", 3));
}
/**
* 设置浏览历史字符串
*
* @param ids
* @param sbookid
* 最新浏览的id号
* @return 修改后的字符串
*/
private static String setValue(String ids, String bookid, int count) {
// 1、 没有任何记录--》直接添加 id
// 2、 1,2,3 4--》 4,1,2
// 3、 1,2,3 2 --》 2,1,3
// 4、1,2 3--》 3,1,2
// 如果不存在Cookie或者Cookie中没有值
StringBuffer sb = new StringBuffer();
if (ids == null) {
sb.append(bookid);
} else {
List<String> list = Arrays.asList(ids.split("\\,"));
LinkedList<String> idsList = new LinkedList<String>(list);
// 未浏览过
if (!idsList.contains(bookid)) {
if (idsList.size() < count) {
idsList.addFirst(bookid);
} else {
idsList.removeLast();
idsList.addFirst(bookid);
}
} else {
// 如果包含已浏览的
idsList.remove(bookid);
idsList.addFirst(bookid);
}
for (String id : idsList) {
sb.append(id).append(",");
}
if (sb != null && sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
}
return sb.toString();
}
/**
* 保存cookie的值
*
* @param request
* @param response
* @param cookieName
* 要保存的cookie的名字
* @param value
* 保存到cookie中的值
*/
public static void saveCookie(HttpServletRequest request,
HttpServletResponse response, String cookieName, String value) {
saveCookie(request, response, cookieName, value, COOKIE_LIFE_TIME);
}
/**
* 删除指定的cookie
*
* @param request
* @param response
* @param cookieName
* 要删除的cookie
*/
public static void deleteCookie(HttpServletRequest request,
HttpServletResponse response, String cookieName) {
saveCookie(request, response, cookieName, "", 0);
}
/**
* 保存cookie 并设置cookie存活的时间
*
* @param request
* @param response
* @param cookieName
* 要保存的cookie的名字
* @param value
* cookie中要存放的值
* @param time
* cookie存活时间
*/
public static void saveCookie(HttpServletRequest request,
HttpServletResponse response, String cookieName, String value,
int time) {
Cookie cookie = new Cookie(cookieName, value);
cookie.setMaxAge(time);// 设置Cookie的存活时间
cookie.setPath(request.getServletContext().getContextPath());
response.addCookie(cookie);// 保存cookie
}
}
转载于:https://www.cnblogs.com/hibernate3-example/archive/2011/11/13/2492705.html