目录
一、会话
1. 会话定义
- 会话是指一个终端用户与交互系统进行通讯的过程,比如用户打开一个浏览器,点击很多超链接,访问了许多的web资源,然后关闭浏览器,这就是一个会话过程。
2. 有状态会话:用户访问过一次,下次再来时服务端知道它曾经来过。
- 如何证明你是某学校的学生
你 学校
1. 发票:学校给你开一张缴费发票,证明你报名入学
2.登记:通过花名册,学校标记你是本校学生
- 如何证明一个网站你来过
客户端 服务器
1.服务端给客户端一个信件(Cookie),客户端下次访问服务端带上信件即可
2.服务器登记(Session)你来过了,下次来的时候可以匹配你
二、保存会话的两种技术
1. Cookie
- 客户端技术
- 保存了该客户机访问这个Web 文档时的信息
- 当客户机再次访问这个 Web 文档时这些信息可供该文档使用
- 储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存
2. Session
- 服务器技术
- Session对象存储特定用户会话所需的属性及配置信息
- 当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去
- 当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象
- 当会话过期或被放弃后,服务器将终止该会话
3.常见情形:网站登陆后,下次不需要再登录,直接就可以访问了。
三、Cookie
- Cookie和域名相关(不同的域名,cookie不同)
- 一般是保存用户的身份信息(身份不同,cookie不同)
- 保存位置在客户端本地文件夹(跟浏览器相关)
package 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 {
//服务器告诉你,你来的时间,把这个时间封装成一个信件,下次来的时候只需要带上即可
//初始化设置中文编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie,服务端从客户端获得
//这里返回数组,说明可以存在多个Cookie
Cookie[] cookies = req.getCookies();
//判断Cookie是否存在
if (cookies != null){
//cookie存在
out.write("上次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie名字
if (cookie.getName().equals("LastLoginTime")){
//获取cookie的值
long LastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(LastLoginTime);
out.write(date.toLocaleString());
}
}
}else{
out.write("这是第一次访问");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("LastLoginTime",System.currentTimeMillis()+"");
resp.addCookie(cookie);
}
}
- Cookie[] cookies = req.getCookies(); //获得cookie
- cookie.getName(); //获取cookie名字
- cookie.getValue(); //获取cookie的值
- Cookie cookie = new Cookie(); //新建一个cookie
- cookie.setMaxAge(); //设置cookie有效期
- resp.addCookie(cookie); //响应给客户端一个cookie
- 如果要使cookie保存中文的信息,需要使用java.net.URLEncoder类的encode方法进行编码
一些细节:
- 一个cookie只能保存一个信息
- 一个web网站可以给浏览器发送多个cookie,最多存放20个cookie
- 浏览器存放上限大约是300个cookie
- cookie大小有限制,大约是40KB
删除cookie
- 不设置有效期,关闭浏览信息后,会自动失效
- 设置有效期时间为0
package 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;
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有效期设为0,立马过期
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
}
四、Session
- session表示一次会话
- session是服务端保存属于的一种实现
package servlet;
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 {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//得到session
HttpSession session = req.getSession();
//给session里面存东西
session.setAttribute("name","小花");
//获取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("SESSIONID",sessionId);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
一些细节
- 服务器会给每一个用户(浏览器)创建一个session对象
- 一个session独占一个浏览器,只要浏览器没关闭,这个session就存在
- 用户登录后,每个网站都可以访问-->保存用户的信息
注销session
- 手动注销
package servlet;
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.removeAttribute("name");
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
- 在web.xml中设置自动注销
<!--设置session的失效时间-->
<session-config>
<!--10分钟后session自动失效,以分钟为单位-->
<session-timeout>10</session-timeout>
</session-config>
五、Session和Cookie的区别
为什么经常把session和cookie联系起来?
- 因为session的实现方式有很多种,其中就可以用cookie来实现session。
cookie | session | |
存储位置 | 保存在客户端本地磁盘中 | 保存在服务端的一种实现 |
使用场景 | 登录时的“记住我”,“xx天免登录”,即浏览器关闭后重新打开仍可以使用 | 同一个浏览器,同一个登录入口进来,在调用其他url服务时,不需要再次输入用户名密码 |
设置方式 | 浏览器将cookie以键值对的形式保存到某个目录下的文本文件内 | 由具体的服务器实现或程序自行实现 |