📅  最后修改于: 2020-11-12 05:42:02             🧑  作者: Mango
HTTP是一种“无状态”协议,这意味着每次客户端检索网页时,客户端都会打开与Web服务器的单独连接,并且服务器不会自动保留先前客户端请求的任何记录。
仍然有以下三种方式来维护Web客户端和Web服务器之间的会话-
Web服务器可以将唯一的会话ID作为cookie分配给每个Web客户端,对于来自客户端的后续请求,可以使用接收到的cookie对其进行识别。
这可能不是一种有效的方法,因为许多浏览器不支持cookie,因此,我不建议使用此过程来维护会话。
Web服务器可以发送隐藏的HTML表单字段以及唯一的会话ID,如下所示-
该条目意味着,提交表单后,指定的名称和值将自动包含在GET或POST数据中。每次Web浏览器发送回请求时,session_id值都可用于跟踪不同的Web浏览器。
这可能是跟踪会话的有效方法,但是单击常规()超文本链接不会导致提交表单,因此隐藏的表单字段也无法支持常规会话跟踪。
您可以在每个用于标识会话的URL的末尾附加一些额外的数据,并且服务器可以将该会话标识符与其已存储的有关该会话的数据相关联。
例如,对于http://tutorialspoint.com/file.htm;sessionid = 12345,会话标识符附加为sessionid = 12345,可以在Web服务器上访问该会话标识符以标识客户端。
URL重写是维护会话的一种更好的方法,即使浏览器不支持Cookie,它也可以工作。 URL重写的缺点是,即使在简单的静态HTML页面的情况下,也必须动态生成每个URL才能分配会话ID。
除了上述三种方式之外,servlet还提供HttpSession接口,该接口提供了一种方法来跨多个页面请求标识用户或访问网站并存储有关该用户的信息。
Servlet容器使用此接口在HTTP客户端和HTTP服务器之间创建会话。该会话在用户的多个连接或页面请求中持续指定的时间段。
您将通过调用HttpServletRequest的公共方法getSession()来获得HttpSession对象,如下所示-
HttpSession session = request.getSession();
在将任何文档内容发送到客户端之前,您需要调用request.getSession() 。这是通过HttpSession对象可用的重要方法的摘要-
Sr.No. | Method & Description |
---|---|
1 |
public Object getAttribute(String name) This method returns the object bound with the specified name in this session, or null if no object is bound under the name. |
2 |
public Enumeration getAttributeNames() This method returns an Enumeration of String objects containing the names of all the objects bound to this session. |
3 |
public long getCreationTime() This method returns the time when this session was created, measured in milliseconds since midnight January 1, 1970 GMT. |
4 |
public String getId() This method returns a string containing the unique identifier assigned to this session. |
5 |
public long getLastAccessedTime() This method returns the last accessed time of the session, in the format of milliseconds since midnight January 1, 1970 GMT |
6 |
public int getMaxInactiveInterval() This method returns the maximum time interval (seconds), that the servlet container will keep the session open between client accesses. |
7 |
public void invalidate() This method invalidates this session and unbinds any objects bound to it. |
8 |
public boolean isNew( This method returns true if the client does not yet know about the session or if the client chooses not to join the session. |
9 |
public void removeAttribute(String name) This method removes the object bound with the specified name from this session. |
10 |
public void setAttribute(String name, Object value) This method binds an object to this session, using the name specified. |
11 |
public void setMaxInactiveInterval(int interval) This method specifies the time, in seconds, between client requests before the servlet container will invalidate this session. |
本示例说明如何使用HttpSession对象找出会话的创建时间和最后访问时间。如果不存在新会话,则将其与请求关联。
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
""-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"\n" +
"" + title + " \n" +
"\n" +
"" + title + "
\n" +
"Session Infomation
\n" +
"
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
编译上面的Servlet SessionTrack并在web.xml文件中创建适当的条目。现在,当您第一次运行时,运行http:// localhost:8080 / SessionTrack将显示以下结果-
Welcome to my website
Session Infomation
info type | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2010 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2010 |
User ID | ABCD |
Number of visits | 1 |
现在尝试第二次运行相同的servlet,它将显示以下结果。
Welcome Back to my website
Session Infomation
信息类型 | 值 |
---|---|
ID | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
创作时间 | 2010年6月8日星期二17:26:40 GMT + 04:00 |
最后访问时间 | 2010年6月8日星期二17:26:40 GMT + 04:00 |
用户身份 | A B C D |
访问次数 | 1个 |
完成用户的会话数据后,您可以有几个选择-
删除特定属性-您可以调用public void removeAttribute(String name)方法来删除与特定键关联的值。
删除整个会话-您可以调用public void invalidate()方法来丢弃整个会话。
设置会话超时-您可以调用public void setMaxInactiveInterval(int interval)方法来分别设置会话超时。
注销用户-支持Servlet 2.4的服务器,您可以调用logout将客户端从Web服务器注销,并使属于所有用户的所有会话无效。
web.xml配置-如果使用的是Tomcat,除了上述方法之外,还可以按以下方式在web.xml文件中配置会话超时。
15
超时以分钟表示,并覆盖默认超时(在Tomcat中为30分钟)。
Servlet中的getMaxInactiveInterval()方法以秒为单位返回该会话的超时时间。因此,如果您的会话在web.xml中配置了15分钟,则getMaxInactiveInterval()返回900。