(三)Servlets Session会话

在Servlet中,会话的维持是经过HttoSession对象进行的,Web容器会自动为每个Http会话都赋予一个惟一的"会话编号"(session 会话 ID)保存为每一个 Web 客户端的 cookie,客户端的每次请求都会自动带有全部cookie,Web容器对于客户端的后续请求可使用接收到的 cookie 来识别。html

HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的链接到 Web 服务器,服务器会自动不保留以前客户端请求的任何记录。java

建议不要使用这种方式来维持 session 会话,由于不少浏览器不支持 cookie。)浏览器

Servlet 提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。服务器

使用这个接口能够建立和管理一个 HTTP 客户端和 HTTP 服务器之间的 session 会话,会话持续一个指定的时间段,跨多个链接或页面请求。cookie

HttpServletRequest对象提供了getSession()方法,经过这个方法,Servlet就能够得到用户当前会话对象的引用。session

HttpSession session = request.getSession();

返回与当前请求相关联的会话,若是当前请求尚未一个相关联的会话,就建立一个并返回。网站

HttpSession session = request.getSession(boolean create);

返回与当前请求相关联的会话,若是当前请求尚未一个相关联的会话,且参数值为true,则就建立一个并返回;若参数值为false,将返回null。url

HttpSession 对象中可用的几个重要的方法以下:spa

序号 方法 & 描述
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 会话无效以前,指定客户端请求之间的时间,以秒为单位。

示例以下:code

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对象是同样的。

相关文章
相关标签/搜索