谈到Cookie和Session,我们就得先了解一下会话这个概念。那么网络上的一次会话定义是什么呢?
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称之为会话。
有状态会话:给一次会话加上标志位,证明他来过。举一个现实生活中的例子,一个同学来到教室,下次同学再来教室,我们就知道这个同学曾经来过,这就称之为有状态会话。
每篇无奖问答:
我们该如何证明你是某个学校的学生呢?
你 学校
这其实无外乎两种方式:一种是学校给你一张缴费单,上面有你的相关信息,你进入学校后,可以把它作为你身份的凭证。
另外一种是学校对你的信息进行登记,就像你在班级里都有一个固定的学号信息,这就是你身份的·凭证。
继续思考一下,一个网站又如何证明你来过呢(类比学校和你的关系)
客户端 服务器
上面的例子我们可以做出如下总结:
网络上保存会话有两种技术:
Cookie : 客户端技术 (响应,请求)
Session: 服务端技术,利用这个技术,可以保存用户的会话信息。
常用场景:网站登录之后,你下次不用再登录,第二次直接就登上去了。
用户第二次可以免登陆的原因:
[1] 服务器 从客户端的请求中拿到cookie信息
[2] 服务端响应客户端的cookie信息
Cookie的主要方法
(其中req表示request对象,resp表示response对象)
Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一个cookie对象
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie
以一个设置cookie的有效期为例子
package com.gs.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;
/**
* @Auther: Gs
* @Date: 2020/5/16
* @Description: PACKAGE_NAME
* @version: 1.0
*/
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器给客户端响应一个Cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
//cookie有效期为1天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
记得写完cookie后都要进行注册,因为它本质上是一个Servlet类
在web.xml上进行注册
<servlet>
<servlet-name>CookieDemo02servlet-name>
<servlet-class>com.gs.servlet.CookieDemo02servlet-class>
servlet>
<servlet-mapping>
<servlet-name>CookieDemo02servlet-name>
<url-pattern>/cookie2url-pattern>
servlet-mapping>
这样cookie的信息就可以保存一天了。
思考:一个网站的cookie是否存在上限?
删除Cookie
使用场景:
Session 和Cookie的区别:
Session的使用:(本质上也是同一个Servlet)
package com.gs.servlet;
import com.gs.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @Auther: Gs
* @Date: 2020/5/16
* @Description: com.gs.servlet
* @version: 1.0
*/
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//得到session
HttpSession session = req.getSession();
//在session中存东西
session.setAttribute("name",new Person("张三",18));
//获取session的ID
String sessionId = session.getId();
//判断session是不是新创建的
if(session.isNew()){
resp.getWriter().write("session创建成功,Id:"+sessionId);
}else {
resp.getWriter().write("session已经在服务中存在了,ID:"+sessionId);
}
//session创建的时候做了什么事情
//Cookie cookie = new Cookie("JSESSIONID", sessionId);
//resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
其他的使用说明:
session可以存放对象,可以手动注销,也可以移除某个key
(其中Person是一个实体对象)
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());
session.removeAttribute("name");
//手动注销session
session.invalidate();
上面的Session类写完记得在web.xml中注册
<servlet>
<servlet-name>SessionDemo01servlet-name>
<servlet-class>com.gs.servlet.SessionDemo01servlet-class>
servlet>
<servlet-mapping>
<servlet-name>SessionDemo01servlet-name>
<url-pattern>/s1url-pattern>
servlet-mapping>
我们不仅能在 Servlet类对Session的值进行设置,还可以在web.xml中进行设置
比如:设置会话自动过期
<session-config>
<session-timeout>1session-timeout>
session-config>
以上就是Sesion和Cookie的全部内容,其实这两者的本质都是键值对,只不过Cookie是客户端的行为,Session是服务器的行为。而且Cookie的value值只能是字符串,而Session则是Object,所以Session在我们日常开发中使用较为广泛。
下面是关于我们浏览器中保存的Cookie值,(我们每个人通过审查元素都能看到浏览器对于我们会话的保存)