cookie机制及cookie的应用

cookie简介

        一般来说,cookie通过HTTP Headers从服务器端返回到浏览器上。将不重要的信息存在cookie中,减轻服务器压力

        cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。

        cookie的使用是由浏览器按照一定的原则在后台携带给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

cookie的缺点

        1、cookie数量和长度的限制。一般每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。

        2、安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。例如:隐私泄漏

Java操作cookie

cookie的主要内容

        主要包括:名字,值,过期时间,路径和域。
        路径、域和作用范围:其中域可以指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com,可以用飘柔(是宝洁的一个子品牌)来做比。可以在java中通过cookie.setDomain(".soncookie.com"); 设置,这个参数必须以“.”开始。 
        路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某地飘柔专柜做比。
        路径与域合在一起就构成了cookie的作用范围。
        过期时间:如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种cookie被称为会话cookie。会话cookie是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
/**
 * 读取所有cookie
 * 注意二、从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期
 * @param request
 * @param response
 */
@RequestMapping("/showCookies")
public void showCookies(HttpServletRequest request,HttpServletResponse response ){
	 
	Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组
	if (null==cookies) {
		System.out.println("没有cookie=========");
	} else {
		for(Cookie cookie : cookies){
			System.out.println("name:"+cookie.getName()+",value:"+ cookie.getValue());
		}
	}
	 
}
/**
 * 添加cookie
 * @param response
 * @param name
 * @param value
 */
@RequestMapping("/addCookie")
public void addCookie(HttpServletResponse response,String name,String value){
	Cookie cookie = new Cookie(name.trim(), value.trim());
	cookie.setMaxAge(30 * 60);// 设置为30min
	cookie.setPath("/");
	System.out.println("已添加===============");
	response.addCookie(cookie);
}
/**
 * 修改cookie
 * @param request
 * @param response
 * @param name
 * @param value
 * 注意一、修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
 */
@RequestMapping("/editCookie")
public void editCookie(HttpServletRequest request,HttpServletResponse response,String name,String value){
	Cookie[] cookies = request.getCookies();
	if (null==cookies) {
		System.out.println("没有cookie==============");
	} else {
		for(Cookie cookie : cookies){
			if(cookie.getName().equals(name)){
				System.out.println("原值为:"+cookie.getValue());
				cookie.setValue(value);
				cookie.setPath("/");
				cookie.setMaxAge(30 * 60);// 设置为30min
				System.out.println("被修改的cookie名字为:"+cookie.getName()+",新值为:"+cookie.getValue());
				response.addCookie(cookie);
				break;
			}
		}
	}
	 
}
/**
 * 删除cookie
 * @param request
 * @param response
 * @param name
 */
@RequestMapping("/delCookie")
public void delCookie(HttpServletRequest request,HttpServletResponse response,String name){
	Cookie[] cookies = request.getCookies();
	if (null==cookies) {
		System.out.println("没有cookie==============");
	} else {
		for(Cookie cookie : cookies){
			if(cookie.getName().equals(name)){
				cookie.setValue(null);
				cookie.setMaxAge(0);// 立即销毁cookie
				cookie.setPath("/");
				System.out.println("被删除的cookie名字为:"+cookie.getName());
				response.addCookie(cookie);
				break;
			}
		}
	}
} 

操作cookie的工具类

public class CookieUtil(){

	/**
	 * 根据名字获取cookie的值  默认使用“utf-8”编码
	 * @param request
	 * @param name cookie名字
	 * @return
	 */
	public static String getCookieValueByName(HttpServletRequest request,String name){
		Cookie cookie = getCookieByName(request,name);
		if(cookie!=null&&StringUtil.isNotBlank(cookie.getValue())){
			return URLDecoder.decode(cookie.getValue(),"UTF-8″);
		}else if(cookie.getValue()!=null){
			return "";
		}else{ 
			return null;
		}   
	}

	/**
	 * 根据名字修改cookie  
	 * @param request
	 * @param name cookie名字
	 * @param value cookie值
	 * @param expire cookie新的过期时间--为0则表示删除
	 * @param created cookie不存在是否新建
	 * @return
	 */
	public static Cookie modCookieByName(HttpServletRequest request,String name,String value, Integer expire,boolean created){
		Cookie cookie=getCookieByName();
		if(null!=cookie){
			cookie.setMaxAge(expire);
			cookie.setValue(URLEncoder.encode(value.trim(),"UTF-8″));
		}else(null==cookie){
			if(created){
				Cookie cookie=createCookie(name,value,expire);
			}
		}
		return cookie;
	}

	/**
	 * 新建cookie  默认path为“/”,默认所有值进行UTF-8编码
	 * @param request
	 * @param name cookie名字
	 * @param value cookie值
	 * @param expire cookie过期时间--为0则表示删除
	 * @return
	 */
	public static Cookie createCookie(String name,String value,Integer expire){
		
		Cookie cookie = new Cookie(name.trim(), URLEncoder.encode(value.trim(),”UTF-8″));
		cookie.setMaxAge(expire);
		cookie.setPath("/");
		return cookie;
	}

	/**
	 * 根据名字获取cookie
	 * @param request
	 * @param name cookie名字
	 * @return
	 */
	public static Cookie getCookieByName(HttpServletRequest request,String name){
		Map cookieMap = ReadCookieMap(request);
		if(cookieMap.containsKey(name)){
			Cookie cookie = (Cookie)cookieMap.get(name.trim();
			return cookie;
		}else{
			return null;
		}   
	} 
	 
	/**
	 * 将cookie封装到Map里面
	 * @param request
	 * @return
	 */
	private static Map ReadCookieMap(HttpServletRequest request){  
		Map cookieMap = new HashMap();
		Cookie[] cookies = request.getCookies();
		if(null!=cookies){
			for(Cookie cookie : cookies){
				cookieMap.put(cookie.getName(), cookie);
			}
		}
		return cookieMap;
	}
}

cookie的应用

1、session

        session就是基于cookie实现的。session机制

2、购物车

        cookie+DB数据库实现购物车

        至于如何实现cookie+DB的购物车过几天分享


你可能感兴趣的:(web与tomcat,Java基础)