Session
1.基本概念
当人们去医院就诊时,就诊病人需要办理医院的就诊卡,该卡上只有卡号,而没有其它信息。但病人每次去该医院就诊时,只要出示就诊卡,医务人员便可根据卡号查询到病人的就诊信息。Session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病历档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。那么哪些数据存在session中呢 ?
使用servlet生成验证码时,我们需要在服务器记录一份生成的随机字符,当用户提交填写的数据时,将用户输入的数据和服务器缓存的数据进行比对。
将随机字符串保存在ServletContext中或者request中是否可以?
不可以,通过下面的两种情况可知,将数据保存到ServletContext和request中是存在问题的,那么就需要使用会话技术保存用户的私有信息.
2.原理
3.应用场景
保存购物车数据
保存用户浏览器记录数据
保存用户登录信息数据
保存验证码
4.存储数据与 获取数据
HttpServletRequest
HttpSession getSession() 获取session对象
HttpSession
void setAttribute(String name, Object value) 在session中保存数据
Object getAttribute(String name) 从session中获取数据
void removeAttribute(String name) 从session中移除数据
package hm04_session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(urlPatterns = "/gets")
public class SessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
/*
由于 session对象由 Tomcat创建 , 所以只能通过request对象, 获取 Session对象.
getSession() : 获取Session .
1. request 中 包含 cookie --JSESSIONID ,根据id去查找 session ,返回session对象.
2. 通过id没有找到, 新创建一个session ,更新 id 和 session对象.
在找不到的情况下,才会新建一个Session对象!
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取 Session 对象
HttpSession session = request.getSession();
// 获取 JSESSIONID
String id = session.getId();
response.getWriter().println(id);
}
}
5.session持久化
关闭浏览器继续可以访问session数据
实现:访问一次服务器,然后关闭浏览器,再访问一次:两次session对象一致
具体实现:
创建一个servlet
通过request对象获取session的id
自定义一个cookie对象,保存session的id,注意cookie名称为"JSESSIONID",设置一个比较长的生存时间
发送给浏览器
@WebServlet(name = "SessionServlet2",urlPatterns = "/session2")
public class SessionServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
//获取session对象
HttpSession session = request.getSession();
System.out.println(session);
//自己创建一个cookie,要求被浏览器持久化保存起来 (setMaxAge(10000))放便后期使用
Cookie cookie = new Cookie("JSESSIONID", session.getId());
//活的久一点
cookie.setMaxAge(10000);
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doGet(request, response);
}
}
6.session生命周期
session对象什么时候创建
当调用request.getSession()方法时 .请求没有携带jsessionid或者携带的不匹配 , 就会创建.
session对象什么时候销毁
默认30分钟销毁, tomcat全局配置文件web.xml , 从最后一次访问时间计时.
手动销毁 : 调用方法session.invalidate();
关闭服务器 , 不考虑钝化的情况.
7.session的与cookie的区别