在Servlet中,会话的维持是通过HttoSession对象进行的,Web容器会自动为每一个Http会话都赋予一个唯一的"会话编号"(session 会话 ID)保存为每个 Web 客户端的 cookie,客户端的每次请求都会自动带有所有cookie,Web容器对于客户端的后续请求可以使用接收到的 cookie 来识别。
HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
(建议不要使用这种方式来维持 session 会话,因为很多浏览器不支持 cookie。)
Servlet 提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
使用这个接口可以创建和管理一个 HTTP 客户端和 HTTP 服务器之间的 session 会话,会话持续一个指定的时间段,跨多个连接或页面请求。
HttpServletRequest对象提供了getSession()方法,通过这个方法,Servlet就可以获得用户当前会话对象的引用。
HttpSession session = request.getSession();
返回与当前请求相关联的会话,如果当前请求还没有一个相关联的会话,就创建一个并返回。
HttpSession session = request.getSession(boolean create);
返回与当前请求相关联的会话,如果当前请求还没有一个相关联的会话,且参数值为true,则就创建一个并返回;若参数值为false,将返回null。
HttpSession 对象中可用的几个重要的方法如下:
序号 | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。 |
2 | public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。 |
3 | public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
4 | public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
5 | public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
6 | public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。 |
7 | public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
8 | public boolean isNew( 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
9 | public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。 |
10 | public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。 |
11 | public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
示例如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class SessionTrack extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(true); // 如果session会话不存在,则创建一个session对象
Date createTime = new Date(session.getCreationTime()); // 获取session创建时间
Date lastAccessTime = new Date(session.getLastAccessedTime()); //获取最后访问时间
String welcome = null;
int visitCount = 0; //记录访问次数
if (session.isNew()) { //检查是否新访问者
welcome = "您是第1次访问本网站";
} else {
visitCount = (Integer) session.getAttribute("visitCount");
visitCount = visitCount + 1;
welcome = "您是第"+visitCount+"次访问本网站";
}
session.setAttribute("visitCount", visitCount);
out.println(welcome+"<br>");
out.println("您的session会话 ID是"+session.getId()+"<br>");
out.println("您的session会话 ID创建时间"+createTime+"<br>");
out.println("您的session会话 ID最后访问时间"+lastAccessTime+"<br>");
}
}
URL重写:
在Servlet中,对超链接可采用response.encodeURL("url")。进行URL重写用response.sendRedirect( response.encodeURL("url") )时,它能把用户的Session追加在网址末尾,可保证用户在不同页面时Session对象是一样的。