Cookie 和 Session
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,称之为有状态会话;
一个网站怎么证明你来过?
- 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;Cookie
- 服务器登记你来过了,下次你来的时候服务器来匹配你;Session
保存会话的两种技术
Cookie
- 客户端技术(响应,请求)
Session
- 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或数据放在session中
Cookie
- 服务器可以从请求中拿到Cookie信息,并且添加更改或删除Cookie信息
- 客户端发送给服务器的请求携带Cookie信息
package com.kangzhu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
// Cookie,服务器从客户端获取
Cookie[] cookies = req.getCookies(); // 说明Cookie可能存在多个
// 判断Cookie是否存在
if (cookies != null) {
out.write("您上次访问的时间是:");
for (Cookie cookie : cookies) {
if (cookie.getName().equals("lastLoginTime")) {
// 获取cookie中的值
String value = cookie.getValue();
long lastLoginTime = Long.parseLong(value);
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}else {
out.write("这是您第一次来");
}
// 只能存一个字符串
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
cookie.setMaxAge(24*60*60); // 设置cookie的有效期为一天
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Cookie一般会保存在本地的用户目录下appdata目录下;
Cookie规范:
- Cookie通过请求头和响应头在服务器和客户端之间传输
- 一个web站点最多在浏览器上保存20个Cookie
- Cookie大小上限为4kb
- 一个浏览器最多保存300个Cookie
删除Cookie
- 不设置有效期,关闭浏览器,自动失效;
- 设置有效期时间为零;
Session(重点)
什么是session:
- 服务器会给每一个用户(浏览器)创建一个Session对象;
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
获取Session,设置一些属性:
package com.kangzhu.servlet;
import com.kangzhu.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(); // 获取session
session.setAttribute("name", "kangzhu"); // 给session中存东西
session.setAttribute("person", new Person("kangzhu", 18));
// 获取session的ID
String id = session.getId();
// 判断session是不是新创建的
if (session.isNew()) {
resp.getWriter().write("session创建成功");
}else {
resp.getWriter().write("session已经在服务器中存在");
}
// Session创建的时候做了什么?(猜想)
// 浏览器在访问web资源的时候,请求所带的cookie中有”JSESSION
// Cookie cookie = new Cookie("JSESSIONID", id);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
获取Session,获取保存在Session中的属性:
package com.kangzhu.servlet;
import com.kangzhu.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(); // 获取session
String name = (String) session.getAttribute("name");
Person person = (Person) session.getAttribute("person");
System.out.println(name);
System.out.println(person.getName());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
获取Session,移除Session的属性,移除Session:
package com.kangzhu.servlet;
import com.kangzhu.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(); // 获取session
session.removeAttribute("name");
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
设置Session的默认存在时间:(单位是分钟)
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Session和Cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存
- Session是把用户的数据写到用户独占的Session中,服务器中保存
Cookie和Session是什么时候创建的
Cookie和Session都是由服务器创建的;
浏览器在访问服务器资源的时候,如果服务器响应中添加了cookie,那响应到达浏览器的时候,浏览器就会将cookie保存在本地;
很多人误以为浏览器一访问服务器Session便被创建,但其实只有在服务器端调用
HttpSession session = req.getSession();
时Session才会被创建;
下次自动登录怎么实现
-
将登录数据存放在Session中(服务器端)
下次浏览器访问时服务器从Session中查找登录数据,改变登录状态
note:需要设置存放"JSESSIONID"的cookie的存在时间,这样再次访问服务器的时候能够找到对应的Session,而不会重新创建Session
-
将登录数据存放在Cookie中(客户端)
下次浏览器访问时服务器从Cookie中查找登录数据,改变登录状态
note:需要设置存放用户登录信息的cookie的存在时间