序号 | 名称 | 数据存放位置 |
---|---|---|
1 | Cookie技术 | 会话数据保存在浏览器客户端。 |
2 | Session技术 | 会话数据保存在服务器端。 |
2、Session技术
2.1、引入
Cookie的局限:
1)Cookie只能存字符串类型。不能保存对象
2)只能存非中文。
3)1个Cookie的容量不超过4KB。
如果要保存非字符串,超过4kb内容,只能使用session技术!!!
Session特点:会话数据保存在服务器端。(内存中)
1.2、Session技术核心
HttpSession类:用于保存会话数据
序号 | 类别 | API |
---|---|---|
1 | 创建或得到session对象 | HttpSession request.getSession() HttpSession request.getSession(boolean create) |
2 | 设置session对象 | void setMaxInactiveInterval(int interval) : 设置session的有效时间 void invalidate() : 销毁session对象 String getId() : 得到session编号 |
3 | 保存会话数据到session对象 | void setAttribute(String name, Object value) : 保存数据 Object getAttribute(String name) : 获取数据 void removeAttribute(String name) : 清除数据 |
1.3、Session原理
问题: 服务器能够识别不同的浏览者!!!
代码解读:HttpSession session = request.getSession();
1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID
2)把JSESSIONID作为Cookie的值发送给浏览器保存
Cookie cookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器
4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。
5)如果找到对应编号的session对象,直接返回该对象
6)如果找不到对应编号的session对象,则创建新的session对象,继续走1、2的流程
结论:通过JSESSIONID的cookie值在服务器找session对象!!!!!
获取或生成session对象Demo03.java
package com.rk.http.b_session; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 获取或生成session对象 * @author lsieun * */ public class Demo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通过访问HttpSession对象,使Tomcat服务器生成名为JSESSIONID的Cookie HttpSession session = request.getSession(); } }
显示session对象信息Demo04.java
package com.rk.http.b_session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 显示session对象信息 * @author lsieun * */ public class Demo04 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(false); if(session != null) { out.write("JSSESSIONID: " + session.getId()); } else { out.write("还没有Session对象"); } } }
1.4、Sesson细节
1)String getId() : 得到session编号(也就是Cookie中JSESSIONID的值)
2)两个getSession方法:
getSession(true) / getSession(): 创建或得到session对象。没有匹配的session编号,自动创建新的session对象。
getSession(false):得到session对象。没有匹配的session编号,返回null
3)void setMaxInactiveInterval(int interval) : 设置session的有效时间(单位:秒)
session对象销毁时间:
3.1 默认情况30分服务器自动回收
3.2 修改session回收时间
3.3 全局修改session有效时间
60
完整的web.xml文件,如下:
60
3.4.手动销毁session对象 void invalidate(): 销毁session对象
向session中添加会话数据Demo05.java
package com.rk.http.b_session; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 向session中添加会话数据 * @author lsieun * */ public class Demo05 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); //向session中保存会话数据 session.setAttribute("username", "rk"); } }
修改session会话数据和有效时间Demo06.java
package com.rk.http.b_session; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 修改session会话数据和有效时间 * @author lsieun * */ public class Demo06 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); //向session中保存会话数据 session.setAttribute("username", "lsieun"); //修改session的有效时间 session.setMaxInactiveInterval(5*60);//保存为5分钟 } }
销毁session对象Demo07.java
package com.rk.http.b_session; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 销毁session对象 * @author lsieun * */ public class Demo07 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if(session!=null){ session.invalidate();//手动销毁 } System.out.println("销毁成功"); } }
获取session的相关信息Demo08.java
package com.rk.http.b_session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 获取session的相关信息 * @author lsieun * */ public class Demo08 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(false); if(session!=null){ String sessionId = session.getId();//获取JSESSIONID int maxInactiveInterval = session.getMaxInactiveInterval();//获取Session的有效时间 String username = (String)session.getAttribute("username");//获取Session中的会话数据 out.write("JSSESSIONID: " + sessionId + "
"); out.write("username: " + username + "
"); out.write("Session的有效时间是: " + maxInactiveInterval + "
"); } else { out.write("还没有Session对象"); } } }
4)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题
/** * 手动发送一个硬盘保存的cookie给浏览器 */ String sessionId = session.getId(); Cookie cookie = new Cookie("JSESSIONID",sessionId); cookie.setMaxAge(1*30*24*60*60);//Cookie保存1个月的时间 response.addCookie(cookie);
完整代码Demo09.java
package com.rk.http.b_session; import java.io.IOException; import java.io.PrintWriter; 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 javax.servlet.http.HttpSession; /** * 案例:如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题 * @author lsieun * */ public class Demo09 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(false); if(session!=null){ /** * 手动发送一个硬盘保存的cookie给浏览器 */ String sessionId = session.getId(); Cookie cookie = new Cookie("JSESSIONID",sessionId); cookie.setMaxAge(1*30*24*60*60);//Cookie保存1个月的时间 response.addCookie(cookie); out.write("已经将JSESSIONID保存入Cookie,重启浏览器后,仍然可以看JSESSIONID信息。"); } else { out.write("没有找到Session对象,重启浏览器后不会看到JSESSIONID信息"); } } }