本文共 5510 字,大约阅读时间需要 18 分钟。
当人们去医院就诊时,就诊病人需要办理医院的就诊卡,该卡上只有卡号,而没有其它信息。但病人每次去该医院就诊时,只要出示就诊卡,医务人员便可根据卡号查询到病人的就诊信息。
Session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。 当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于兵力档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
示例:以购物网站为例,通过下图描述Session保存用户信息的原理:
Session是与每个请求消息紧密相关的,为此i,HttpServletRequest定义了用于获取session对象的getSession()方法,该方法有两种重载形式,具体如下。
public HttpSession getSession(boolean create)public HttpSession getSession()
上面重载的两个方法都用于返回与当前请求相关的HttpSession对象。不同的是,第一个getSession()方法根据传递的参数来判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HtttpSession对象,否则不创建新的HttpSession对象,而是返回null。
第二个getSession()方法则相当于第一个方法参数为true时的情况,在相关的HttpSession对象不存在时总是创建新的HttpSession对象。要想使用HttpSession对象管理会话数据,不仅需要获取到HttpSession对象,还需要了解HttpSession对象的相关方法。HttpSesseion接口中定义的操作会话数据的常用方法如下表:
方法声明 | 功能描述 |
---|---|
String getId() | 用于返回与当前HttpSession对象关联的会话标识号 |
long getCreationTime() | 返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒形式表示 |
long getLastAccessedTime() | 返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式 |
void setMaxInactiveInterval(int interval) | 用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔 |
boolean isNew() | 判断当前HttpSession对象是否是新创建的 |
void invalidate() | 用于强制使Session对象无效 |
ServletContext getServletContext() | 用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象 |
void setAttribute(String name, Object value) | 用于将一个对象与一个名称关联后存储到当前的HttpSession对象中 |
String getAttribute() | 用于从当前HttpSession对象中返回指定名称的属性对象 |
void removeAttribute(String name) | 用于从当前HttpSession对象中删除指定名称的属性 |
使用HttpSession对象获取Session会话创建时间和最后访问时间。如果不存在session会话,我们将通过请求创建一个新的session会话。
package pers.zhang.servlet;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;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;/** * @author zhang * @date 2019/9/19 - 11:29 */public class SessionServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //如果不存在Session会话,则创建一个session对象 HttpSession session = request.getSession(true); //获取session创建时间 Date createTime = new Date(session.getCreationTime()); //获取该网页的最后一次访问时间 Date lastAccessTime = new Date(session.getLastAccessedTime()); //设置日期输出的格式 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String title = "Servlet Session"; Integer visitCount = new Integer(0); String visitCountKey = new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("zhang"); if(session.getAttribute(visitCountKey) == null){ session.setAttribute(visitCountKey, new Integer(0)); } //检查网页上是否有新的访问者 if(session.isNew()){ title = "Servlet Session"; session.setAttribute(userIDKey, userID); }else{ visitCount = (Integer) session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String) session.getAttribute(userIDKey); } session.setAttribute(visitCountKey, visitCount); // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String docType = "\n"; out.println(docType + "\n" + "" + title + " \n" + "\n" + "" + title + "
\n" + "Session 信息
\n" + "
Session 信息 | 值 |
---|---|
id | \n" + "" + session.getId() + " |
创建时间 | \n" + "" + df.format(createTime) + " |
最后访问时间 | \n" + "" + df.format(lastAccessTime) + " |
用户 ID | \n" + "" + userID + " |
访问统计: | \n" + "" + visitCount + " |
浏览器第一次访问,页面显示:
转载地址:http://rnsqb.baihongyu.com/