cookie使用

1.什么是cookie?

1.Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。

2.Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。

2.用在什么地方?

1.用户登录的判断,对http请求无状态的,在浏览器一段,识别的机制。

2.普通网站都不会存重要的信息,它们仅仅存一个你的登陆状态,也就是你拿用户名密码换取的令牌,还有就是网站针对你的判定(比如你在这个网站上的唯一标识是什么,你访问的是我们的哪台服务器,你使用的是我们的哪个版本的产品),这些信息你都不需要关心,它和你的隐私一点关系都没有。
文艺一点的网站会将这些信息进行加密,目的是防止别人伪造这些信息欺骗网站

3.一般用在,验证用户是否登录的一种机制

3.使用方法

在Servlet  API 中,使用java.servlet.http.Cookie类来封装一个Cookie消息,在HttpServletResponse接口中定义了一个addCookie()方法来向浏览器发送Cookie对象,在HttpServletRequest接口中定义了一个getCookies()方法来读取浏览器传递过来的Cookie消息。Cookie类中定义了生成和获取Cookie消息的各个属性的方法。Cookie类只有一个构造方法:

 public Cookie(String name, String value) {
        if (name == null || name.length() == 0) {
            throw new IllegalArgumentException(
                    lStrings.getString("err.cookie_name_blank"));
        }
        if (!isToken(name) ||
                name.equalsIgnoreCase("Comment") || // rfc2019
                name.equalsIgnoreCase("Discard") || // 2019++
                name.equalsIgnoreCase("Domain") ||
                name.equalsIgnoreCase("Expires") || // (old cookies)
                name.equalsIgnoreCase("Max-Age") || // rfc2019
                name.equalsIgnoreCase("Path") ||
                name.equalsIgnoreCase("Secure") ||
                name.equalsIgnoreCase("Version") ||
                name.startsWith("$")) {
            String errMsg = lStrings.getString("err.cookie_name_is_token");
            Object[] errArgs = new Object[1];
            errArgs[0] = name;
            errMsg = MessageFormat.format(errMsg, errArgs);
            throw new IllegalArgumentException(errMsg);
        }

        this.name = name;
        this.value = value;
    }

/*其中name表示Cookie名(在name参数值中不能包含任何空格字符、逗号、分号,并且不能以$字符开头),value表示Cookie 的值。Cookie类的其它常用方法:
getName():该方法返回Cookie 的名称。
setValue()和getValue() :这两个方法分别用于设置和获取Cookie的值。
setMaxAge()和getMaxAge() :这两个方法分别用于设置和获取Cookie在客户端的有效时间(以秒为单位)。如果设置为0,表示当Cookie消息发送到客户端浏览器时被立即删除。如果设置为负数,表示浏览器并不会把这个Cookie保存在硬盘上,这种Cookie被称为临时Cookie(保存在硬盘上的Cookie被称为永久Cookie),它们只存在于当前浏览器的进程中,当浏览器关闭后,Cookie自动失效。对于IE浏览器,不同的窗口不能共享临时Cookie,但按Ctrl+N快捷键或使用JavaScript的window.open语句打开的窗口由于和它们的父窗口属于同一个浏览器进程,因此它们可以共享临时Cookie。而在FireFox中,所有的进程和标签页都可以共享临时Cookie。
setPath和getPath方法:这两个方法分别用于设置和获取当前Cookie的有效Web路径。如果在创建某个Cookie时为设置它的path属性,那么该Cookie只对当前访问的Servlet所在的Web路径及其子路径有效。如果想使Cookie对整个Web站点中的所有可访问的路径都有效,需要将path属性值设置为"/" 。
setComment和getComment方法:这两个方法分别用于设置和获取当前Cookie 的注释部分。
setVersion和getVersion方法:这两个方法分别用于设置和获取当前Cookie的协议版本。
setSecure和getSecure方法:这两个方法分别用于设置和获取当前Cookie是否只能使用安全的协议传输Cookie。
/*

2.代码使用

public static final String APP_NAME ="xxq";

public static final String DEFAULT_COOKIE_DOMAIN = "127.0.0.1";
/**
*存储cookie
*/
public static void saveOrUpdateCookie(String key, String value, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
		boolean isCookieExist = false;
		key = APP_NAME + key;
		value = enSecret(value);
		Cookie[] cookies = request.getCookies();
		if (cookies != null && cookies.length != 0) {
			for (Cookie cookie : cookies) {
				// 判断cookie是否存在,存在则更新cookie
				if (cookie.getName().equals(key)) {
					cookie.setValue(value);
					cookie.setPath("/");
					if (!StringUtils.isEmpty(DEFAULT_COOKIE_DOMAIN)) {
						cookie.setDomain(DEFAULT_COOKIE_DOMAIN);
					}
					cookie.setMaxAge(-1);
					response.addCookie(cookie);
					isCookieExist = true;
					break;
				}
			}
		}
		// 如果cookie不存在则新创建cookie
		if (!isCookieExist) {
			Cookie cookie = new Cookie(key, value);
			cookie.setPath("/");
			if (!StringUtils.isEmpty(DEFAULT_COOKIE_DOMAIN)) {
				cookie.setDomain(DEFAULT_COOKIE_DOMAIN);
			}
			cookie.setMaxAge(-1);
			response.addCookie(cookie);
		}
	}
/**
*查询cookie
*/
public static String getFromCookie(String key, HttpServletRequest request) {
		Cookie[] cookie = request.getCookies();
		if (cookie == null) {
			return null;
		}
		key = APP_NAME + key;
		for (int i = 0; i < cookie.length; i++) {
			if (cookie[i].getName().equals(key)) {
				try {
					String res = cookie[i].getValue();
					if (!StringUtils.isEmpty(res)) {
						return deSecret(res).trim();
					} else {
						return "";
					}
				} catch (Exception e) {
					LOG.error(e.getMessage(), e);
					return null;
				}
			}
		}
		return null;
	}

  参考资料:

   https://blog.csdn.net/chuan_zhang_ak/article/details/52077151

   http://www.cnblogs.com/sdlzspl/p/7446063.html

猜你喜欢

转载自blog.csdn.net/qq_32363305/article/details/82392256