当前位置: 首页 > news >正文

Servlet笔记(10):Session跟踪

Servlet Session 跟踪
Http是一种“无状态”协议,所以需要保存session会话,维持Web服务器连接。

Cookies
一个Web服务器可以分配一个唯一的session会话ID存储至Web客户端的cookie中,对于客户端的后续请求可以使用接收到的cookie来识别。
但是由于部分浏览器不支持cookie,所以需要更换方式维持session会话。

隐藏表单字段

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

每当Web浏览器发送请求时,session_id值可以用于保持不同的 Web浏览器跟踪。
但单击常规超文本链接不会导致表单提交,因此隐藏的表单字段也不支持常规的session会话跟踪。

URL重写
URL重写即使用Get明文方式保持session会话。

http://llocalhost/index.html?sessionid=12345

其缺点在于,每一次重写URL时,都会分配一个session会话ID,造成系统极大的开销。

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

获取HttpSession对象

HttpSession session = request.getSession();

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

HttpSession实例

public class SessionTrack extends HttpServlet{public void doGet(HttpSevletRequest request,HttpServletResponse response) throws ServletException,IOException{//获取session对象,若不存在session会话,则创建一个session对象HttpSession session = request.getSession(true);//获取session创建时间Date createTime = new Date(session.getCreationTime());//获取该页面访问的最后一次时间Date lastAccessTime = new Date(session.getLastAccessedTime());String title = "欢迎回到我的网站";Integer visitCount = new Integer(0);String visitCountKey = new String("visitCount");String userIDKey = new String("userID");String userID = new String("ABCD");// 检查网页上是否有新的访问者if (session.isNew()){title = "欢迎来到我的网站";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");PrintWriter out = response.getWriter();String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " +       "transitional//en\">\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>Creation Time</td>\n" +"  <td>" + createTime + "  </td></tr>\n" +"<tr>\n" +"  <td>Time of Last Access</td>\n" +"  <td>" + lastAccessTime + "  </td></tr>\n" +"<tr>\n" +"  <td>User ID</td>\n" +"  <td>" + userID + "  </td></tr>\n" +"<tr>\n" +"  <td>Number of visits</td>\n" +"  <td>" + visitCount + "</td></tr>\n" +"</table>\n" +"</body></html>");}
}

删除Session会话数据
以下有几种删除会话的选择:

  • 删除特定属性
public void removeAttribute(String name) //name为key值
  • 删除整个会话
public void invalidate()
  • 设置会话过期时间
public void setMaxInactiveInterval(int interval) //interval超时时间
  • 注销用户
    调用logout注销Web服务器的客户端,并把属于所有用户的所有session会话设置为无效。

  • web.xml配置

<session-config><session-timeout>15</session-timeout>	<!-- 以分钟为单位,默认为30分钟 -->
</session-config>
http://www.lryc.cn/news/19318.html

相关文章:

  • Hive---分区表和分桶表
  • C++ STL
  • java程序员要了解的sql语句优化技巧大全
  • SQL零基础入门学习(十)
  • Pytorch从零开始训练模型【识别数字模型】并测试
  • Leetcode DAY 44: 完全背包 and 零钱兑换 II and 组合总和 Ⅳ
  • 谷歌搜索留痕的技术公式【2023年新版】
  • 2023财年Q4业绩继续下滑,ChatGPT能驱动英伟达重回巅峰吗?
  • 博客管理系统--项目说明
  • 一文带你了解MySQL的Server层和引擎层是如何交互的?
  • CVNLP 常用数据集语料库资源汇总
  • lisp 表达式求值规则
  • Sophos Firewall OS (SFOS) 19.5 MR1 - 同步下一代防火墙
  • 为什么很多人转行IT考虑后端开发Java?
  • WebDAV之π-Disk派盘+Cloud Player
  • Python-datetime、time包常用功能汇总
  • Spring MVC 源码- HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler
  • 2023面试必备:web自动化测试POM设计模式详解
  • 【人工智能 AI】Robotic Process Automation (RPA) 机器人流程自动化 (RPA)
  • ubuntu/linux系统知识(37)systemd管理临时文件的方法systemd-tmpfiles
  • 云计算专业和计算机专业哪个好就业?
  • electron sha512 checksum mismatch
  • 使用Chemistry Development Kit (CDK) 来进行化学SMILES子结构匹配
  • CMake模块的使用和自定义模块
  • jvm调优参数配置
  • Leetcode.1567 乘积为正数的最长子数组长度
  • 部分库与使用方法总结(自用)
  • C++实现日期类
  • 想成为一名专业黑客,但不知道从哪里学起?我来教你。
  • VMware ESXi 7.0 U3k Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)