Cookie入门

Cookie入门

基本概述

    Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。Cookie也可以叫做浏览器缓存。

    因为HTTP是无状态的协议,它不能保存用户状态,这时候往往会用到Cookie技术来对用户进行标识并进行一些特定的处理。服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。

参考文档:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html

 

Cookie原理图

    当用户第一次发出请求后,由服务器端创建cookie对象,通过response对象响应给客户端浏览器
    当用户第二次发出请求时,会携带上一次由服务器创建并响应过来的这个cookie

底层代码

    cookie底层是基于Http协议来实现的。通过一个头(Set-Cookie)来进行创建的,一旦创建之后通过response对象的addHeader("Set-Cookie","name=zhangsan")方法写回给客户端
可以通过request.getHeader("Cookie");获取。


案例:

package com.pc;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author Switch
 * 功能:设置Cookie
 */
public class Servlet8 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 字符编码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();

		// 创建Cookie (api)
		Cookie cookie = new Cookie("Switch", "123456");
		// 设置cookie的生命周期
		cookie.setMaxAge(3600);
		// 把cookie信息会写给浏览器
		response.addCookie(cookie);
		
		out.flush();
		out.close();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}

package com.pc;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 
 * @author Switch
 * 功能:获取Cookie
 *
 */
public class Servlet9 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 字符编码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();

		// 获取客户端发过来的所有cookie
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			// 测试
			// System.out.println(cookies.length);
			for(Cookie c : cookies){
				out.println(c.getName() + " " + c.getValue());
			}
		}
		out.flush();
		out.close();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}

package com.pc;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author Switch
 * 功能:测试Cookie同名会发生什么情况
 */
public class Servlet10 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 字符编码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();

		// 创建Cookie (api)
		Cookie cookie1 = new Cookie("Switch2", "123456");
		// 设置cookie的生命周期
		cookie1.setMaxAge(3600);
		// 把cookie信息会写给浏览器
		response.addCookie(cookie1);
		
		// 同名会后面的会覆盖前面的Cookie
		Cookie cookie2 = new Cookie("Switch2", "654321");
		// 设置cookie的生命周期
		cookie2.setMaxAge(3600);
		// 把cookie信息会写给浏览器
		response.addCookie(cookie2);

		out.flush();
		out.close();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}

小结:

1cookie是在服务器创建的

2cookie是保存在浏览器缓存文件中的

3cookie的生命周期是可设置的

cookie.setMaxAge(time); // time是以秒为单位的

如果不设置setMaxAge则当浏览器关闭时,该cookie就消亡。

    cookie生命的设置:setMaxAge(参数);
        setMaxAge(负数):会话级别的Cookie
        setMaxAge(正数):持久级别,他需要配合cookie的路径来进行操作(要先设置cookie的路径)
        setMaxAge(0):结束cookie生命

4cookie可以被多个浏览器共享

5cookie(---)对应关系

namevalue都是String型的

如果设置Cookiename相同,则后设置会覆盖前设置

6、一个web应用中可以保存多个cookie,并且会保存在浏览器缓存文件夹的同一个文件中

7cookie存放方式是以明文的方式,所以为了安全,要进行加密。

8、Cookie的路径
    设置cookie的路径:setPath("");
    Cookie的路径:cookie的路径与是否归还有关!
    Cookie的默认路径:如果有归还,那么此时cookie的路径就为之前创建cookie资源所在的路径。/proj/abc/cookie
    
    http://localhost:8080/poj1/abc/cookie/AServlet

    如果访问以下路径,是否能拿到cookie的内容呢?
        http://localhost:8080/poj1/BServlet  不能!
        
        http://localhost:8080/poj1/abc/cookie/xxx/ddd/BServlet  能!
        
    如果设置了这个路径:
        setPath("/poj1"); 上面都能

结论:当没有设置路径时,默认路径为之前创建cookie资源所在路径。只有在该路径下才能访问cookie,可以通过设置setPath()来扩展路径归范围

9Cookie的域
    设置cookie的域:setDomain();
    用在二级域名共享cookie里面的数据
    
    A:设置cookie的域:setDomain(".baidu.com");
    B:设置cookie的路径:setPath("/");
    www.baidu.com
    tieba.baidu.com
    zhidao.baidu.com
    news.baidu.com

MD5加密算法

package com.pc;
import java.security.*;
import java.security.spec.*;
/**
 * @author Switch
 * 功能:MD5加密
 */
class MD5_test {
	public final static String MD5(String s) {
		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'a', 'b', 'c', 'd', 'e', 'f' };
		try {
			byte[] strTemp = s.getBytes();
			MessageDigest mdTemp = MessageDigest.getInstance("MD5");
			mdTemp.update(strTemp);
			byte[] md = mdTemp.digest();
			int j = md.length;
			char str[] = new char[j * 2];
			int k = 0;
			for (int i = 0; i < j; i++) {
				byte byte0 = md[i];
				str[k++] = hexDigits[byte0 >>> 4 & 0xf];
				str[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(str);
		} catch (Exception e) {
			return null;
		}
	}
	public static void main(String[] args) {
		System.out.print(MD5_test.MD5("Switch"));
	}
}

 

PSMD5是一种单向加密方式,其加密是不可逆转的,但是也可能存在破解方法,不过要一定的时间,所以建议采用MD5 64位加密或者是128位加密,该提供的方法只是32位加密方式。

    使用Cookie保存用户重要信息时,比如密码、银行账号时,必须要进行加密传输存储。

 

案例:保存上次登录的时间

package com.pc;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet11 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 字符编码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();

		// 用Cookie记录上次登录时间
		boolean b = false;
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				// 获取name
				String name = cookie.getName();
				if ("lasttime".equals(name)) {
					// 显示时间
					out.println("上次登录时间是:" + cookie.getValue());
					updateDate(response);
					b = true;
					break;
				}
			}
		}
		if (!b) {
			out.println("这是您第一次登录");
			updateDate(response);
		}
		out.flush();
		out.close();
	}
	private void updateDate(HttpServletResponse response) {
		// 更新时间
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");
		String nowDate = simpleDateFormat.format(new Date());
		Cookie c = new Cookie("lasttime", nowDate);
		// 7天有效期
		c.setMaxAge(3600 * 24 * 7);
		response.addCookie(c);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}

cookie生命周期

    cookie默认的生命周期是会话级别的,也就是说浏览器一关闭cookie立即失效。可以通过setMaxAge(time)的方法设置生命周期。

time        

解释

正数       

设置多少秒后失效

0             

删除该cookie

负数        

设置该cookie为会话级别


案例:

//先得到该cookie
Cookie cookies[]=request.getCookies();
for(Cookie cookie: cookies){
    if(cookie.getName().equals("id")){
        System.out.println("id");
        //删除
        cookie.setMaxAge(0);
        //一定带上这句话,否则不能删除
        response.addCookie(cookie); 
    }
}

PS如果该web应用只有一个cookie ,则删除该cookie后,在浏览器的临时文件夹下没有该cookie文件,如果该web应用有多个cookie,则删除一个cookie后,文件还在,只是该cookie没有。


cookie细节

1关于浏览器保存Cookie个数(在IE6里面默认保存的是20个,之后的版本是50个,其它浏览器<火狐和谷歌>都是存放的50个)
      关于浏览器保存Cookie的长度为4kb.
      当然在浏览器市场竞争日益激烈的条件下,有些浏览器厂商并不遵循统一规范,对cookie的个数和长度做了扩展,但是,不管怎么扩展,它的个数和长度依然有限制。

2cookie存放中文,有可能会出现乱码的情况,这时可以采用如下方法解决

存放:

String val=java.net.URLEncoder.encode("张三","utf-8");

Cookie cookie=new Cookie("name",val);

取出:

String val=java.net.URLDecoder.decode(cookie.getValue(), "utf-8");

out.println("name ="+val);

 

 

 

----------参考《韩顺平.细说Servlet


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值