Cookie和Session

放肆的年华 提交于 2020-03-07 02:28:41

Cookie

饼干. 其实是一份小数据, 是服务器给客户端,并且存储在客户端上的一份小数据

应用场景

自动登录、浏览记录、购物车。

为什么要有这个Cookie

http的请求是无状态。 客户端与服务器在通讯的时候,是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访问过。 为了更好的用户体验,更好的交互 [自动登录],其实从公司层面讲,就是为了更好的收集用户习惯[大数据]

Cookie怎么用

添加Cookie给客户端

  1. 在响应的时候,添加cookie
	Cookie cookie = new Cookie("aa", "bb");	
	//给响应,添加一个cookie
	response.addCookie(cookie);
  1. 客户端收到的信息里面,响应头中多了一个字段 Set-Cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NKLqpjFd-1583496353227)(img/img02.png)]

获取客户端带过来的Cookie

//获取客户端带过来的cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
    for (Cookie c : cookies) {
        String cookieName = c.getName();
        String cookieValue = c.getValue();
        System.out.println(cookieName + " = "+ cookieValue);
    }
}

清除Cookie

Cookie没有提供delete方法,我们要删除需要设置maxAge 为0 。

Cookie cookie = new Cookie("history","");
cookie.setMaxAge(0); //设置立即删除
cookie.setPath("/CookieDemo02");
response.addCookie(cookie);

其他常用方法

//关闭浏览器后,cookie就没有了。 ---> 针对没有设置cookie的有效期。
//	expiry: 有效 以秒计算。
//正值 : 表示 在这个数字过后,cookie将会失效。
//负值: 关闭浏览器,那么cookie就失效, 默认值是 -1
cookie.setMaxAge(60 * 60 * 24 * 7);

//赋值新的值
//cookie.setValue(newValue);

//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(".itheima.com");

//只有访问该域名下的cookieDemo的这个路径地址才会带cookie
cookie.setPath("/CookieDemo");

Cookie示例 实现记住密码功能

  1. 用户打开网站后,自动读取Cookie中存储的用户名、密码
  2. 如果存在,自动填充到表单中
  3. 如果不存在,说明是第一次登录,需要登录后在后台将用户名、密码写入Cookie中,以便下次登录时自动填充

主要实现代码

前端登录页

<body>
	<form action="LoginServlet" method="post">
		用户名: <input id="username" type="text" name="userName" οnblur="inputPwd()" >
		<br />
		密&nbsp;&nbsp;&nbsp;&nbsp;码:
		<input id="pwd" type="password" name="password">
		<br />
		<input type="checkbox" name="remeber_me" value="true" /> 记住密码 
		<br />
		<input type="submit" value="登录">
	</form>
</body>
<!-- 引入js操作Cookie的第三方库,也可以使用原生js API -->
<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
<script type="text/javascript">
	
	// 从cookies里面按照用户输入的username去查找对应的password,
	// 如果找到,说明用户已经登录成功过,并且已经记录到cookie里。
	// 我们直接把对应的密码从cookie中拿出来,设置password密码框里
	
	// my_cookies其实就是一个map, 存储了所有的cookie键值对
	var my_cookies = Cookies.get();
	console.log(my_cookies);
	
	var pwdInput = document.getElementById("pwd");
	var username = document.getElementById("username");
	
	// 当输入完用户名,文本框失去焦点时,去cookie中找对应的密码,
	// 如果找到,直接填充到密码框里
	function inputPwd() {
		var userName = username.value;
		var cookieKey = "username-" + userName;
		console.log(cookieKey);
		var cookiePwd = my_cookies[cookieKey];
		console.log(cookiePwd);
		if(cookiePwd) {
			pwdInput.value = cookiePwd;
		}
	}
</script>

后台处理代码

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("UTF-8");
		
		// 获取前台表单提交的用户名、密码
		String userName = request.getParameter("userName");
		String password = request.getParameter("password");
		
		// 获取前台是否勾上了记住密码
		String sRemeber = request.getParameter("remeber_me");
		boolean remeber = false;
		try {
			remeber = Boolean.parseBoolean(sRemeber);
		} catch (Exception e) {
		}
		
		
		// 设置响应格式和编码
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		if(isBlank(userName) || isBlank(password)) {
			out.println("<script>alert('用户名或密码不能为空!'); window.location.href='login.jsp';</script>");
			return;
		}
		
		if(!userAccountData.containsKey(userName)) {
			out.println("<script>alert('不好意思,您还没有注册!'); window.location.href='login.jsp';</script>");
			return;
		}
		
		String orginPassword = userAccountData.get(userName);
		if(password.startsWith("pwd-")) {
			password = password.substring(4);
		}
		
		if(orginPassword.equals(password)) {
			out.println("登录成功!");
			if(remeber) {
				Cookie cookie = new Cookie("username-" + userName, "pwd-" + password);
				cookie.setMaxAge(120);
				response.addCookie(cookie);
			}
			return;
		} else {
			out.println("<script>alert('用户名或密码不正确,请重新输入!'); window.location.href='login.jsp';</script>");
			return;
		}
	}

Cookie总结

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

  2. 创建Cookie:

    使用new来创建Cookie对象

    Cookie cookie = new Cookie("xxx", "wangzhenongyao");
    
  3. 添加cookie

    添加cookie通过响应对象的addCookie方法

    // 底层实现原理其实是在响应头中添加了一个: Set-Cookie: password=qiaoshouyuan; Max-Age=60; Expires=Fri, 20-Sep-2019 08:41:19 GMT; HttpOnly
    response.addCookie();
    
  4. 获取cookie

    Cookie[] cookies = request.getCookies();
    
    
  5. Cookie有效时间

    1. 会话Cookie

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

      这是默认的行为,但是大部分现代的浏览器都不会这么做,比如chrome浏览器,默认打开时会恢复上次关闭时的状态,所有关闭浏览器cookie并不会失效。 我们可以设置浏览器打开时不恢复上次状态,改为打开新的标签页即可。

    2. 持久Cookie

      通过设置MaxAge指定存活时间,在存活时间内,都有效,并且会保存在客户端上。

    cookie.setMaxAge(0); //设置立即删除  
    cookie.setMaxAge(100); //100 秒
    
    
  6. Cookie的安全问题。

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

  7. Cookie不能直接存储中文,需要做转码

Session

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

常用API

//得到会话ID
String id = session.getId();

//存值
session.setAttribute(name, value);

//取值
session.getAttribute(name);

//移除值
session.removeAttribute(name);

Session创建和销毁

创建

在调用所有可以获取session的页面中(如:JSP、Servlet),就会创建Session,并且浏览器Cookie中也会生成JSESSIONID

获取Session

request.getSession();

销毁

session 是存放在服务器的内存中的一份数据。

  1. 关闭服务器
  1. session会话时间过期。 有效期过了,默认有效期: 30分钟。

移除Session中的元素

//强制干掉会话,里面存放的任何数据就都没有了。
session.invalidate();

//从session中移除某一个数据
//session.removeAttribute("cart");

总结:

Cookie

服务器给客户端发送一小份数据, 存放在客户端上。

基本用法:

添加cookie

获取cookie。

什么时候有cookie

response.addCookie(new Cookie())

Cookie 分类

  • 会话Cookie

    关闭浏览器,就失效

  • 持久cookie

    存放在客户端上。 在指定的期限内有效。

      setMaxAge();
    

Session

也是基于cookie的一种会话技术, 数据存放存放在服务器端,会在cookie里面添加一个字段 JSESSIONID . 是tomcat服务器生成。

常用API

setAttribute 存数据
 
getAttribute 取数据

removeAttribute  移除数据

req.getRequestedSessionId();  获取会话id
session.getId();  获取会话id

invalidate() 强制让会话失效。

创建和销毁

  • 创建: 首次访问所有可以调用request.getSession方法的页面时,session创建,同时JSESSIONID也会生成
  • 销毁:
    • 关闭浏览器
    • 会话超时(默认是30分钟)
    • 服务端调用invalidate

Cookie和Session的区别

  1. Cookie数据存放到客户端(浏览器),Session存放在服务端;
  2. Cookie存放的数据大小有限制,不能超过4k;很多浏览器都限制一个站点最多保存20个cookie。
  3. Cookie由于存放在客户端硬盘上,所以相较于Session来说安全性低一点;
  4. cookie失效时间是通过setMaxAge来设置,session是通过setInactiveInterval方法设置
  5. Cookie中只能存储字符串的值,而且还不能中文。而Session中可以存储任意语言的字符串,或者Java中的所有类型。
  6. Cookie是由程序员在业务代码中自己创建的,而Session是由容器创建的。

Cookie和Session的关系

HTTP协议本身是无状态的,也就是说服务端无法通过一个请求判断出谁是谁,而Session作为服务端跟踪用户状态的一项技术,在整个容器中存在很多份数据。如何知道一个请求进来应该拿哪份Session数据这是个问题。那么要解决这个问题,我们需要在请求中添加一个标识,Cookie技术就解决了这个问题。具体来说,Tomcat会在浏览器第一次访问JSP、Servlet时分配一个独一无二的Cookie标识(JSESSIONID),写到浏览器端。后续每次请求时,浏览器会携带这个标识,进而服务端就可以区分出来谁是谁,然后拿对应的Session数据。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!