特点
会话数据保存在服务器端。
Session技术核心
1、创建或得到session对象
HttpSession getSession()
HttpSession getSession(boolean create)
2、设置session对象
#设置session的有效时间
void setMaxInactiveInterval(int interval)
#销毁session对象
void invalidate()
#得到session编号
String getId()
3、保存会话数据到session对象
#保存数据
void setAttribute(String name, Object value)
#获取数据
Object getAttribute(String name)
#清除数据
void removeAttribute(String name)
Session原理
1、第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID;2、把JSESSIONID作为Cookie的值发送给浏览器保存;
3、第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器;4、服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象;
5、如果找到对应编号的session对象,直接返回该对象;6、如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
结论:通过JSESSIONID的cookie值在服务器找session对象。
public class SaveSessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.创建session对象 HttpSession session = request.getSession(); // 2.保存会话数据 session.setAttribute("name", "rose"); } }
public class GetSessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.创建session对象 HttpSession session = request.getSession(); if(session==null){ System.out.println("没有找到对应的sessino对象"); return; } // 2.取出数据 String name = (String)session.getAttribute("name"); System.out.println("name="+name); } }
Session细节
public class SaveSessionServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 细节 1) * getSession(true)/getSession():创建或得到session对象,没有匹配的session编号,自动创 建新的session对象。 * getSession(false):得到session对象,没有匹配的session编号,返回null。 */ // 1.创建session对象 HttpSession session = request.getSession(); /** * 得到session编号 */ System.out.println("id="+session.getId()); /** * 细节 2) * session域对象默认30分钟服务器自动回收,手动设置session域对象的有效时间 */ //session.setMaxInactiveInterval(20); /** * 细节 3) * 浏览器JSESSIONID的cookie是放在浏览器内存中的,会随着浏览器关闭而丢失 * 手动发送一个保存在硬盘的cookie给浏览器 */ Cookie cookie = new Cookie("JSESSIONID",session.getId()); cookie.setMaxAge(60*60); response.addCookie(cookie); // 2.保存会话数据 session.setAttribute("name", "rose"); } }
public class DeleteSessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if(session != null){ /** * 细节 4) * 手动销毁session */ session.invalidate(); System.out.println("销毁成功"); } } }