Cookie和Session

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()。
阅读更多
文章标签: JavaWeb
个人分类: JavaWeb
上一篇Response对象以及从服务端下载文件(解决乱码问题)
下一篇利用Session区域完成登录页面校验(包含验证码校验)
想对作者说点什么? 我来说一句

sessioncookie区别精选

2017年09月12日 20KB 下载

sessioncookie的区别

2018年01月09日 3KB 下载

PHP 关于cookie的应该

2008年11月22日 8KB 下载

CookieSession深入剖析图示

2012年11月04日 128KB 下载

sessioncookie

2015年03月06日 23KB 下载

CookieSESSION有什么区别

2011年06月26日 30KB 下载

Cookie,Session开发大全

2011年12月04日 12KB 下载

没有更多推荐了,返回首页

关闭
关闭