Cookie和Session

原创 2018年04月16日 23:13:35

Cookie是服务器交给客户端存储的数据,默认为关闭客户端(浏览器)的时候销毁,因此再次打开客户端的时候,会获取一个新的cookie。


cookie可以存储指定的信息,服务端可以通过new Cookie(String name, String value)的方式创建cookie对象键值对,需要注意的是,键值对为非中文字符串cookie创建成功后,可以通过设置持久化时间,将cookie对象保存到本地,而在客户端关闭的时候依然可以在一定时间内进行保存。

设置cookie的持久化时间

cookie.setMaxAge(int second); 	

客户端保存cookie后,在访问服务器资源的时候默认会携带cookie进行访问,而有时候我们只希望某个cookie在访问特定资源的时候才被携带,那么我们可以通过设置cookie的路径来决定客户端访问服务器特定资源的时候携带特定cookie对象。

//cookie.setPath("/WEB/sendcookie");  //仅当访问/WEB/sendcookie时才携带本cookie
cookie.setPath("/WEB");  //当访问WEB应用下的所有资源时携带cookie
//或写为cookie.setPath(request.getContextPath());
//cookie.setPath("/");  //当访问服务器下所有web应用时都会携带cookie

在服务端创建完cookie并进行设置后,我们需要将cookie发给客户端,告诉客户端把cookie存好别丢了

//2.发送cookie给客户端
response.addCookie(cookie);

客户端在收到服务端发送的cookie后,将它们都保存起来,在访问服务端的时候携带这些cookie。此时服务端将获取客户端发来的cookie并进行选择

//获取客户端携带的cookie
Cookie[] cookies = request.getCookies();
if(cookies != null) {
	for(Cookie cookie : cookies) {
		if("name".equals(cookie.getName())) {
			//输出cookie的value值
			System.out.println(cookie.getValue());  	//zhangsan
			return;			//找到cookie后不再循环,节省循环次数
		}
	}
}

而有时候,由于设置某个cookie的持久化时间太长,我们在应用中并不再需要这个cookie,此时可以通过覆盖该cookie的办法将其销毁,具体方式则是设置本cookie的持久化时间为0.

//删除客户端已经保存的name=zhangsan的cookie
//重新创建一个同名的cookie,将原先的cookie覆盖掉,设置持久化时间为0
Cookie cookie = new Cookie("name", "zhangsan");		//参数中cookie值可以不同,cookie名必须相同
cookie.setPath(request.getContextPath());  			//设置该web应用下的同名cookie
cookie.setMaxAge(0);
response.addCookie(cookie);

附带一个cookie的使用案例:返回用户上一次访问的时间

思路:客户端在访问服务器时,判断该客户端是否存有记录上次访问时间的cookie,若没有则创建一个cookie,将时间赋值给cookie并发送给客户端;客户端在第二次访问时,就可以获取到记录有上次访问时间的cookie,而获取cookie的时间值。

package cookie;

import java.io.IOException;
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 LastAccessTime extends HttpServlet {
	private static final long serialVersionUID = 6297117105828937472L;

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.返回一个cookie给用户,value值为当前访问时间
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String currentime = sdf.format(date);
		Cookie cookie = new Cookie("lastAccessTime", currentime);
		
		cookie.setMaxAge(60*60*5);
		//2.发送cookie给用户
		response.addCookie(cookie);
		//3.获取用户携带的cookie数组
		Cookie[] cookies = request.getCookies();
		//匹配浏览器能识别的中文
		response.setHeader("content-type", "text/html;charset=utf-8");
		if(cookies != null) {
			for(Cookie co : cookies) {
				if("lastAccessTime".equals(co.getName())) {
					//输出反馈信息
					response.getWriter().write("您上次登录时间是 "+co.getValue());
					return;
				}
			}
		}
		response.getWriter().write("您是第一次访问本网页");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}


Session和Cookie有点相似,但Session是在服务器上开辟的一块数据存储区域,它是一个域对象。客户端在访问服务器时,服务器会检测客户端携带的cookie是否有JSESSIONID值,若有则找到该ID值对应的session区域,若没有则开辟一个新的session区域,用于数据存储,我们可以通过request请求的getSession()方法来创建/返回一个Session对象,并获取JSESSIONID值

//创建属于客户端私有的session区域
HttpSession session = request.getSession();
//获取session的ID
String id = session.getId();
response.getWriter().write("JSESSIONID:"+id);

但是由于存储JSESSIONID的cookie默认为会话级别,即当客户端关闭时,cookie对象会进行销毁,而再次访问时由于无法找到带有JSESSIONID的cookie对象,服务器会再次创建一个新的session区域,从而无法找到前一次在session中存储的数据信息。对此我们可以将这种cookie设置持久化时间保存在本地。

设置cookie时需要注意,保证cookie的路径一致,JSESSIONID也要一致

//由于携带JSESSIONID的cookie默认会话级别,客户端关闭后cookie销毁
//获取session的ID
String id = session.getId();
//需要手动创建cookie存储JESSIONID,并设置持久化时间
Cookie cookie = new Cookie("JSESSIONID", id);
cookie.setPath("/WEB/");  		//抓包工具获取
cookie.setMaxAge(60*60*2);		//持久化时间2小时
response.addCookie(cookie);
此时我们便可以放心大胆往session中存储数据了,具体方法依然是通用的set/get/removeAttribute()。

会话session和cookie原理(备java基础,jsp,servlet,tomcat)

-
  • 1970年01月01日 08:00

session与cookie区别精选

  • 2017年09月12日 10:29
  • 20KB
  • 下载

session和cookie的区别

  • 2018年01月09日 13:01
  • 3KB
  • 下载

浅谈Session与Cookie的区别与联系

一、Session的概念Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识...
  • duan1078774504
  • duan1078774504
  • 2016-07-14 21:02:55
  • 43666

深入分析理解session与cookie的作用

session与cookie在web开发中我们用到的不少了,那么关于session与cookie你有深入理解吗?今天我们就一起来看一篇关于深入分析理解session与cookie的作用的例子。 ...
  • u011816231
  • u011816231
  • 2017-04-06 09:38:59
  • 5098

session与cookie的介绍和两者的区别之其相互的关系

本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对自己的开发工作中灵活运用带来启示。 c...
  • weixin_37196194
  • weixin_37196194
  • 2017-02-19 18:28:28
  • 5966

cookie与session的区别与联系

一、cookie与session的区别 cookie保存在客户端,未设置存储时间的cookie为会话cookie保存在浏览器的进程开辟的内存中,当浏览器关闭后会话cookie也会被删除;设置了存储时间...
  • wangzl1163
  • wangzl1163
  • 2017-05-03 09:15:46
  • 1109

理解Session和Cookie机制

一、Cookie机制 在web程序中是使用HTTP协议来传输数据的,因为http是无状态协议,一旦数据交换完毕,客户端和服务器端的连接就会关闭,再次交换数据需要建立新的连接,所以无法实现会话跟踪,c...
  • bingogirl
  • bingogirl
  • 2016-06-25 23:41:51
  • 1270

cookie和session工作机制和使用场合详解

虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web...
  • jaryle
  • jaryle
  • 2016-08-21 18:40:08
  • 1256

Cookie和Session之间的关系重新复习一下

Cookie干嘛的? 会话(cookie,session)技术的一种. 因为http协议是无状态的,每次都是基于一个请求一个响应.每次请求和响应都跟上次没有关系. 我们需要记录之前对话信息...
  • dodan
  • dodan
  • 2016-07-14 23:41:02
  • 3250
收藏助手
不良信息举报
您举报文章:Cookie和Session
举报原因:
原因补充:

(最多只允许输入30个字)