(三)Servlets Session会话

本文介绍了Servlet中如何利用HttpSession接口实现会话管理,包括创建和管理HTTP客户端与服务器之间的会话,以及如何使用getSession方法获取会话对象。此外,还提供了一个具体的示例代码,演示了如何记录用户的访问次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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 对象中可用的几个重要的方法如下:

序号方法 & 描述
1public Object getAttribute(String name)
该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
2public Enumeration getAttributeNames()
该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
3public long getCreationTime()
该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
4public String getId()
该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
5public long getLastAccessedTime()
该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
6public int getMaxInactiveInterval()
该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
7public void invalidate()
该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
8public boolean isNew(
如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
9public void removeAttribute(String name)
该方法将从该 session 会话移除指定名称的对象。
10public void setAttribute(String name, Object value) 
该方法使用指定的名称绑定一个对象到该 session 会话。
11public 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对象是一样的。

 

转载于:https://my.oschina.net/u/2321708/blog/742442

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值