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()。
阅读更多
想对作者说点什么?

博主推荐

换一批

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