JavaWeb之Cookie&Session

Cookie

直译是:小饼干。实际上,Cookie就是由服务器给客户端,并且存储在客户端上的一份小数据

应用场景

自动登录,查看浏览记录,购物车

Cookie存在的意义

HTTP请求是无状态的,客户端与服务器在通讯的时候,是无状态的。所以在客户端第二次访问服务器时,服务器不知道该客户端是否访问过。为了更好的用户体验,更好的交互【自动登录】,对公司来说,更好的收集用户习惯【大数据】

Cookie的使用

添加Cookie到客户端

1.在响应时添加Cookie

Cookie c = new Cookie("aa", "bb");
//使用response的addCookie(c)方法
response.addCookie(c);

2.在客户端收到的信息里,响应头就多出Set-Cookie字段

Cookie01

获取客户端带过来的Cookie

Cookie c = new Cookie("aa", "bb");
		Cookie c1 = new Cookie("cc", "dd");

		response.addCookie(c);
		response.addCookie(c1);
	//使用request的getCookies()方法
		Cookie[] cookies = request.getCookies();
		if(cookies!=null) {
			for (Cookie cookie : cookies) {
				String name = cookie.getName();
				String value = cookie.getValue();
				System.out.println(name + "=" + value);
			}
		}

常用方法

1.设置cookie的有效期
public void setMaxAge(int expiry)
设置 cookie 的最大生存时间,以秒为单位。

在浏览器关闭后,cookie就没有了,没有设置cookie的有效期

expiry:有效。以秒计算

​ 正值:表示在这个时间过后,cookie会失效。

​ 负值:关闭浏览器,则cookie就会失效。默认值为-1

2.赋新值
public void setValue(String newValue)
在创建 cookie 之后将新值分配给 cookie
3.用于指定只有请求了指定的域名,才会带上该cookie
public void setDomain(String pattern)
指定应在其中显示此 cookie 的域。
4.只有访问该域名下的cookieDemo的这个路径地址才会带cookie
public void setPath(String uri)
指定客户端应该返回 cookie 的路径。 
cookie 对于指定目录中的所有页面及该目录子目录中的所有页面都是可见的。cookie 的路径必须包括设置 cookie 的 servlet,例如 /catalog,它使 cookie 对于服务器上 /catalog 下的所有目录都是可见的。 

移除Cookie

官方没有提供delete方法。 也没有什么remove方法。

Cookie cookie = new Cookie("aa","bb");
cookie.setMaxAge(60*60*24);
reponse.addCookie(cookie);

删除cookie

一: 得到以前的cookie,然后重新设置有效期
Cookie [] cookies = request.getCookies();
Cookie cookie = CookieUtil.findCookie(cookies , "aa");
cookie.setMaxAge(0);
reponse.addCookie(cookie);
二:创建一个新的cookie
Cookie cookie = new Cookie("aa","xx");
cookie.setMaxAge(0);
reponse.addCookie(cookie);

例子 显示最近访问的时间。

  1. 判断账号是否正确

  2. 如果正确,则获取cookie。 但是得到的cookie是一个数组, 我们要从数组里面找到我们想要的对象。

  3. 如果找到的对象为空,表明是第一次登录。那么要添加cookie

  4. 如果找到的对象不为空, 表明不是第一次登录。

	if("admin".equals(userName) && "123".equals(password)){
		//获取cookie last-name --- >
		Cookie [] cookies = request.getCookies();
		
		//从数组里面找出我们想要的cookie
		Cookie cookie = CookieUtil.findCookie(cookies, "last");
		
		//是第一次登录,没有cookie
		if(cookie == null){
			
			Cookie c = new Cookie("last", System.currentTimeMillis()+"");
			c.setMaxAge(60*60); //一个小时
			response.addCookie(c);
			
			response.getWriter().write("欢迎您, "+userName);
			
		}else{
			//1. 去以前的cookie第二次登录,有cookie
			long lastVisitTime = Long.parseLong(cookie.getValue());
			
			//2. 输出到界面,
			response.getWriter().write("欢迎您, "+userName +",上次来访时间是:"+new Date(lastVisitTime));

			//3. 重置登录的时间
			cookie.setValue(System.currentTimeMillis()+"");
			response.addCookie(cookie);
		}
	}else{
		response.getWriter().write("登陆失败 ");
	}

Cookie总结

  1. 服务器给客户端发送过来的一小份数据,并且存放在客户端上。

  2. 获取cookie, 添加cookie

request.getCookie();

response.addCookie();

  1. Cookie分类

会话Cookie
默认情况下,关闭了浏览器,那么cookie就会消失。

持久Cookie

在一定时间内,都有效,并且会保存在客户端上。 

cookie.setMaxAge(0); //设置立即删除

cookie.setMaxAge(100); //100 秒
  1. Cookie的安全问题。

由于Cookie会保存在客户端上,所以有安全隐患问题。 还有一个问题, Cookie的大小与个数有限制。 为了解决这个问题 —> Session .

Session

会话,Session是一种基于Cookie的一种会话机制。Cookie是服务器返回一小份数据给客户端,并且储存在客户端。Session的数据存放在服务器端

  • 常用API

      //得到会话ID
      String id = session.getId();
      
      //存值
      session.setAttribute(name, value);
      
      //取值
      session.getAttribute(name);
      
      //移除值
      session.removeAttribute(name);
    
  • Session何时创建 , 何时销毁?

  • 创建

如果有在servlet里面调用了 request.getSession()

  • 销毁

session 是存放在服务器的内存中的一份数据。 当然可以持久化. Redis . 即使关了浏览器,session也不会销毁。

  1. 关闭服务器
  1. session会话时间过期。 有效期过了,默认有效期: 30分钟。
原文地址:https://www.cnblogs.com/wf614/p/11673838.html