什么是session呢?了解session之前,先要简单了解http协议。

http协议是面向无连接的协议,一次请求,一次操作,然后就结束了,是没有状态的。就是说,用户请求一次,server响应一次,完了它就翻脸不认人了。换句话说,每次用户的访问都是独立的。这样就带来了问题,实际上用户往往需要多次请求服务器才能完成一次操作事件,比如说购物这一事件要经过访问物品信息、添加购物车、结算三次请求。那么服务器如何知道这三次请求都来自于同一个用户呢?这时就是session在起作用。

session的作用

当服务器需要记录用户的状态,需要某种机制来识别具体的用户时,这个机制就是Session。

在B\S结构中,存在很多用户连接服务器发送请求的状况,又由于HTTP是无状态协议,那么服务器是如何区别各个用户发送的请求呢?当一个用户第一次连接上服务器时,服务器就产生惟一的一个标识ID放入线程池并储存。当新的请求发送来时,服务器就与线程池中的ID进行匹配从来达到区别各个用户请求的目的。

当用户关闭浏览器或与服务器的连接断开时,存放在线程池中的session就会取消。

有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:

Cookies

服务器在第一次接收到客户端的请求时,会给客户端分配一个唯一的sessionid存放到客户端下次访问时携带的cookie中,这样客户端在接下来的访问中都会通过cookies中的sessionid作为同一用户的标识。

Cookie的作用是记录用户的一些信息,也是实现session的一种方式。服务端会在HTTP协议中告诉客户端,需要在cookie中记录一个Session ID,以后每次请求把这个Session ID发送到服务器,服务器就能识别具体的客户。

如果客户端禁用Cookie怎么办?一般这种情况,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如sid=xxxx这样的参数,服务根据这个参数来识别用户。

Cookie的应用场景:假设你某次登录过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取Cookie里面的信息,就自动帮你把用户名和密码填了,能够方便用户。这也是Cookie名称的由来,给用户的一点甜头。

隐藏的表单字段

利用HTML的hidden属性,将客户端的信息,在用户不察觉的情形下,随着请求一起发送给服务器处理。

一个 Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID,如下所示:

<input type="hidden" name="sessionid" value="12345">

当表单被提交时,指定的名称和值会被自动包含在 GET 或 POST 数据中。每次当 Web 浏览器发送请求时,session_id 值可以用于保持不同的 Web 浏览器的跟踪。

这是一种保持 session 会话跟踪的有效方式,但是点击常规的超文本链接(A HREF…)不会导致表单提交,因此隐藏的表单字段也不支持常规的 session 会话跟踪。

URL 重写

URL重写是指服务器程序对接收的URL请求重新写成网站可以处理的另一个URL的过程。URL重写技术是实现动态网站会话跟踪的重要保障。在实际应用中,当不能确定客户端浏览器是否支持Cookie的情况下,使用URL重写技术可以对请求的URL地址追加会话标识,从而实现用户的会话跟踪功能。

您可以在每个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。

例如,http://w3cschool.cc/file.htm;sessionid=12345,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。

URL 重写是一种更好的维持 session 会话的方式,它在浏览器不支持 cookie 时能够很好地工作,但是它的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此。

HttpSession 对象

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

Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。

您会通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象,如下所示:

HttpSession session = request.getSession();

你需要在向客户端发送任何文档内容之前调用 request.getSession()。下面总结了 HttpSession 对象中可用的几个重要的方法:

Session 跟踪实例

本实例说明了如何使用 HttpSession 对象获取 session 会话创建时间和最后访问时间。如果不存在 session 会话,我们将通过请求创建一个新的 session 会话。

package com.runoob.test;import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** Servlet implementation class SessionTrack*/
@WebServlet("/SessionTrack")
public class SessionTrack extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{// 如果不存在 session 会话,则创建一个 session 对象HttpSession session = request.getSession(true);// 获取 session 创建时间Date createTime = new Date(session.getCreationTime());// 获取该网页的最后一次访问时间Date lastAccessTime = new Date(session.getLastAccessedTime());//设置日期输出的格式  SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String title = "Servlet Session 实例 - 菜鸟教程";Integer visitCount = new Integer(0);String visitCountKey = new String("visitCount");String userIDKey = new String("userID");String userID = new String("Runoob");if(session.getAttribute(visitCountKey) == null) {session.setAttribute(visitCountKey, new Integer(0));}// 检查网页上是否有新的访问者if (session.isNew()){title = "Servlet Session 实例 - 菜鸟教程";session.setAttribute(userIDKey, userID);} else {visitCount = (Integer)session.getAttribute(visitCountKey);visitCount = visitCount + 1;userID = (String)session.getAttribute(userIDKey);}session.setAttribute(visitCountKey,  visitCount);// 设置响应内容类型response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();String docType = "<!DOCTYPE html>\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" +"<h1 align=\"center\">" + title + "</h1>\n" +"<h2 align=\"center\">Session 信息</h2>\n" +"<table border=\"1\" align=\"center\">\n" +"<tr bgcolor=\"#949494\">\n" +"  <th>Session 信息</th><th>值</th></tr>\n" +"<tr>\n" +"  <td>id</td>\n" +"  <td>" + session.getId() + "</td></tr>\n" +"<tr>\n" +"  <td>创建时间</td>\n" +"  <td>" +  df.format(createTime) + "  </td></tr>\n" +"<tr>\n" +"  <td>最后访问时间</td>\n" +"  <td>" + df.format(lastAccessTime) + "  </td></tr>\n" +"<tr>\n" +"  <td>用户 ID</td>\n" +"  <td>" + userID + "  </td></tr>\n" +"<tr>\n" +"  <td>访问统计:</td>\n" +"  <td>" + visitCount + "</td></tr>\n" +"</table>\n" +"</body></html>"); }
}

编译上面的 Servlet SessionTrack,并在 web.xml 文件中创建适当的条目。

<?xml version="1.0" encoding="UTF-8"?>
<web-app><servlet> <!-- 类名 -->  <servlet-name>SessionTrack</servlet-name><!-- 所在的包 --><servlet-class>com.runoob.test.SessionTrack</servlet-class></servlet><servlet-mapping><servlet-name>SessionTrack</servlet-name><!-- 访问的网址 --><url-pattern>/TomcatTest/SessionTrack</url-pattern></servlet-mapping>
</web-app>

在浏览器地址栏输入 http://localhost:8080/TomcatTest/SessionTrack,当您第一次运行时将显示如下结果:

再次尝试运行相同的 Servlet,它将显示如下结果:

删除 Session 会话数据

当您完成了一个用户的 session 会话数据,您有以下几种选择:

  • 移除一个特定的属性:您可以调用 public void removeAttribute(String name)
    方法来删除与特定的键相关联的值。

  • 删除整个 session 会话:您可以调用 public void invalidate() 方法来丢弃整个 session 会话。

  • 设置 session 会话过期时间:您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时。

  • 注销用户:如果使用的是支持 servlet 2.4 的服务器,您可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效。

  • web.xml 配置:如果您使用的是 Tomcat,除了上述方法,您还可以在 web.xml 文件中配置 session 会话超时,如下所示:

  <session-config><session-timeout>15</session-timeout></session-config>

上面实例中的超时时间是以分钟为单位,将覆盖 Tomcat 中默认的 30 分钟超时时间。

在一个 Servlet 中的 getMaxInactiveInterval() 方法会返回 session 会话的超时时间,以秒为单位。所以,如果在 web.xml 中配置 session 会话超时时间为 15 分钟,那么 getMaxInactiveInterval() 会返回 900。

Servlet Session 跟踪相关推荐

  1. servlet session 跟踪用户上次访问时间

    1.是什么? 上次访问时间:即用户最近一次登录时间: 2.为什么? 为了提示用户登录或访问记录,提高安全性,如qq登录提示: 3.怎么做? 通过cookie 实现: 用户第1次登录, 服务器把访问时间 ...

  2. 使用logon trigger完成动态的session跟踪

    在之前讨论过 关于oracle中session跟踪的总结,可以参见链接 http://blog.itpub.net/23718752/viewspace-1150568/ 基本的session跟踪方法 ...

  3. java web 请求跟踪_IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术

    原标题:IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术 Cookie使用HTTPHeader传递数据.Cookie机制定义了两种报头,Set-Cookie报头和Cookie报 ...

  4. Servlet - 会话跟踪

    Servlet 标签 : Java与Web 会话跟踪 HTTP本身是"无状态"协议,它不保存连接交互信息,一次响应完成之后即连接断开,下一次请求需要重新建立连接,服务器不记录上次连 ...

  5. 使用JSP实现简单的登录注册功能,并且使用Session跟踪用户登录信息

    使用JSP实现简单的登录注册功能,并且使用了Session来跟踪用户的登录信息,这个是用纯JSP来实现此功能的,由于没有连接数据库,所以使用List来模拟数据库. 第一步:创建web项目 如果有不会创 ...

  6. servlet session listener

    HttpSessionListener-创建与销毁 //@WebListener servlet3.0支持注解 public class HttpSessionListenerDemo impleme ...

  7. servlet session持久化

    1. session持久化是什么?  web服务器把 session中存储的属性存储到本地磁盘或数据库中: 2.为什么需要持久化? 因为 session是服务器维护会话状态的对象,即便客户端关闭连接或 ...

  8. Servlet session: 用session实现简单 购物车

    目录 实现步骤 导航栏 Book BookDB listBookServlet purcharseServlet cartServlet web.xml 实现步骤 1. 创建 Book 封装图书信息 ...

  9. java Servlet Session

    session解决了同一用户不同请求的数据共享问题//如果没有session对象,则自动创建一个 HttpSession session=request.getSession(); //设置有效期 s ...

最新文章

  1. pangolin最新版 v2.5.2.975
  2. 线性回归模型中的多重共线性--Multicollinearity
  3. oracle mysql 付费_oracle数据库要钱的吗?
  4. HTTP VS RPC
  5. max格式转obj小工具_Python写图片格式批量处理工具!你还一张一张转格式吗?
  6. tomcat没有错,但是还是一闪而过(端口被占用)
  7. Zookeeper客户端Curator使用详解
  8. scrapy没有运行结果_关于Scrapy爬虫项目运行和调试的小技巧(下篇)
  9. python 单例模式
  10. React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三、四
  11. HDU 5643 约瑟夫环的应用
  12. jni调用dll方法报UnsatisfiedLinkError
  13. 树莓派:openCV之火焰检测
  14. DVD转RMVB及DVD转AVI相关教程
  15. u盘怎么装服务器系统教程,u盘装服务器系统教程
  16. python火车票自我编写_自己动手写100行Python代码抢火车票!
  17. 通讯录2.0(动态内存增长版本)
  18. 对话政企CIO:融合对企业网络通信的新意义
  19. 北信源 华为鸿蒙,华为鸿蒙生态加速!北信源率先参与其中
  20. sublime text3 去除python代码的白色框框方法

热门文章

  1. java bank项目答案_Bank项目-java
  2. Windows update一直停留在正在检查更新,为什么
  3. 从IT应用架构角度,畅谈双活数据中心容灾解决方案
  4. vSphere 故障排除之网络篇
  5. 云原生时代,Java 的危与机
  6. mysql数据库复制功能配置,最详细的mysql数据库主从复制功能配置教程(docker版本)...
  7. python中pip不可用_python – pip无法确认SSL证书:SSL模块不可用
  8. node.js发送html,利用Node.JS实现邮件发送功能
  9. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——BarcodeView控件的使用方式,.Net移动开发...
  10. More Effective C++ 笔记