什么是Session?
- 服务器会给每个用户(浏览器)创建一个Session对象。
- 一个Session独占一个浏览器,只要浏览器没有关闭,Session就一直存在。
- 用户登陆后,整个网站都可以访问!(保存用户的信息到服务器)
重点方法
- getId 获取Session的id
- getServletContext 获取上下文对象
- getAttribute 得到节点(多个Servlet之间数据访问数据)
- setAttribute 设置节点(存数据),Session的setAttribute参数中,可以传入一个Object对象作为 节点对应的值。
- removeAttribute 移除节点
- invalidate 注销
- isNew 判断是不是新创建的Session
Session和Cookie的区别?
测试代码:
SessionDemo01:创建Session并设置节点信息。
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.setAttribute("name","李元芳"); //向Session String id = session.getId(); //判断是不是新创建的Session boolean isNew = session.isNew(); if (isNew){ resp.getWriter().write("session创建成功,ID="+id); //会写到页面上 }else { resp.getWriter().write("session创建失败,服务器中已存在,ID="+id); } //Session做了什么? Cookie cookie = new Cookie("JSESSIONID",id); resp.addCookie(cookie); } }
SessionDemo02: SessionDemo01在创建Session后,SessionDemo02测试读取Session设置的节点数据。
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 { //解决乱码问题 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); //获取SessionDemo01的Session并读取节点 name 的数据 HttpSession session = req.getSession(); String name = (String) session.getAttribute("name"); System.out.println(name); } }
我们发现服务器给我们返回了一个关于 SessionId 的Cookie 作为响应。
相当于
Cookie cookie = new Cookie("JSESSIONID",id); resp.addCookie(cookie);
再次访问
- 除此之外,Session还可以存储 对象!!
- 少用ServletContext存储信息(多了会爆炸),尽量用Session。
- 只要一旦注销Session(session.invalidate()),会立即再生成一个新的Session
session.invalidate() 可以手动使 Session 失效,我们也可以在 web.xml 中设置自动注销Session:
<session-config> <!-- 单位为分钟 设置session1分钟后自动过期 --> <session-time-out>1</session-time-out> </session-config>
Session和Cookie的区别:
- Cookie 是把用户的数据写到用户的浏览器(可以保存多个)。
- Session 是把用户的数据写到用户独占的Session中,由服务器保存(保存重要的信息)。
- Session 对象由服务器创建。
Session使用场景:
- 保存登陆用户的信息
- 购物车信息
- 整个网站中经常使用的数据