JavaEE——Session会话追踪的实现机制篇

一、引言

       :在Web应用程序中,我们经常要跟踪用户身份。例如:当一个用户登录成功后,如果他继续访问其他页面,Web 程序如何才能识别出该用户身份?当一个用户在操作自己的购物车时,Web 程序如何才能识别出该用户身份?

        答因为HTTP协议是一个无状态协议,即Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以识别用户身份。

二、Session

        我们把这种基于唯一ID识别用户 身份的机制称为Session。每个用户第一次访问服务器后,会自动获得一个Session ID。如果用户在一段时间内没有访问服务器,那么Session自动失效(这个时间Tomcat默认是30分钟,但是可以在xml文件里重新进行配置),下次即使带着上次分配的Session ID 访问,服务器也认为这是一个新户,分配新的Session ID。一次Session 会话中往往包含着若干次request 请求。

        JavaEE的Servlet机制内建了对Session的支持。当我们需要获取Session 时,可以通过request 请求对象的getSession() 方法。例如:

HttpSession session = request.getSession();

我们得到Session后,可以进行的常见操作有:

  • void setAttribute(String name, object value):将指定Key-Value 键值对,存入当前Session 会话中object getAttribute(String name):按照指定的Key从当前Session 会话中获取Value , 返回值为object 类型的对象,如果不存在,则返回null。
  • void removeAttribute(Stringname):按照指定的Key从当前Session 会话中删除Key-Value 键值对。
  • long getCreationTime():获取当前Session 会话的创建时间。
  • long getLastAccessedTime():获取当前Session 会话最后一次请求的访问时间。
  • String getId():获取当前Session会话的SESSION ID

        服务器识别Session 的关键就是依靠一个 名为JSESSIONID 的Cookie 。在Serv1et中第一次调用 req.getSession()时,Servlet 容器自动创建一个SessionID,然后通过一个名为JSESSIONID 的Cookie 发送给浏览器,例如我们访问360浏览器首页:


 

        如果想在控制台上查看Session Id:

@WebServlet("/test.do")
public class test extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		System.out.println(session.getId());
	}
}

 

 

        注: 使用Session时,于服务器把所有用户的Session都存储在内存中,如果遇到内存不足的情况,就需要把部分不活动的Session 列化到磁盘上,这会大大降低服务器的运行效率,因此,放入Session 的数据不能太大,否则会影响服务器的运行。

三、Cookie

        实际上,Servlet 提供的HttpSession本质上就是通过一个名为JSESSIONID 的Cookie来跟踪用户会话的。除了这个名称外其他名称的Cookie我们可以任意使用。

        创建一个新Cookie时,除了指定名称和值以外,通常需要设置setPath("/"),浏览器根据此前缀决定是否发送Cookie 。如果一个 Cookie调用了setPath( "/user/"),那么浏览器只有在请求以/user/ 开头的路径时才会附加此Cookie。通过setMaxAge() 设置Cookie的有效期,单位为秒,后通过resp.addcookie()把它添加到响应。

        通过创建Cookie, 我们可以实现在客户端浏览器中存 储数据的目的,例如保存用户名和密码。在Chrome浏览器中,单个Cookie 的长度不能超过4069个字符(包括name,但不包括=号)。

        我们可以在浏览器看到服务器发送的cookie以百度为例:

 

 

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ButNullPointer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值