状态跟踪

http协议是一种无状态的协议,当请求/响应完成后,连接会断开。服务器会认为每次请求的用户都是新用户,从而无法跟踪用户的状态。但是,在开发中,很多时候服务器需要跟踪用户的状态,从而进行一系列的商务活动。如何让服务器知道,值一系列的请求都是同一个用户的行为呢?

WEB 服务器 跟踪状态有五种:

1、隐藏表单

2、cookie

3、session

4、URL重写

5、JWT


隐藏表单

利用 <input type='hidden' name='userId' value='tiger'>  隐藏表单向服务器发送请求。在隐藏表单中存放该用户的唯一标识。服务器在接收到隐藏表单后,发现两个请求的表单数据一致,就认为是同一个用户。

缺点:

1、每个页面的每个请求,都得加上用户唯一标识的隐藏表单,很是繁琐。 2、用户唯一标识,必须由开发者自己书写算法。


Cookie

Cookie是服务器端给客户端发送的一段文本。

工作流程: 客户端访问服务器。服务器利用resp.addCookie(Cookie 对象),向客户端发送Cookie信息。产生响应时,会产生set-cookie响应头,并附加cookie信息。当客户端再次请求服务器,会将之前服务器发送给客户的Cookie信息,再以Cookie请求头的方式,发送给服务器。服务器发现发送和接受的Cookie信息一致就认为是同一个用户。

Cookie的分类

cookie在客户端存放的方式有两种: 1、存放在客户端浏览器的缓存中,当浏览器不关闭时,可以一直将缓存中的cookie 信息发送给服务器。当浏览器关闭,缓存小时,cookie信息随之消失。 2、如果在 cookie 中设置了过期时间,那么cookie信息在发送给客户端以后,会以文件方式存放在客户端,在过期时间内,可以一直将cookie信息发送给服务器。

向客户端发送cookie 信息

//创建cookie对象
Cookie c1 = new Cookie("name","tom");
Cookie c2 = new Cookie("userId","23");
//设置过期时间
c2.setMaxAge(60);//向客户端发送cookie信息
response.addCookie(c1);
response.addCookie(c2);

服务器得到cookie信息

//得到客户端提交的Cookie信息
Cookie[] cookieArray = request.getCookies();
String str = "";
for (Cookie c : cookieArray){str += "键:"+c.getName()+"值:"+c.getValue();
}

Cookie 的缺陷:

1、Cookie信息以文本方式存放在客户端,容易引起安全隐患。 2、用户的唯一标识,同样需要开发者自行编写。


Session

Session 是服务器端用户跟踪客户端信息的对象。

工作流程: 客户端第一次访问服务器,服务器调用 request.getSession()为该用户创建跟踪状态的Session对象。 同时给该对象分配一个唯一标识 sessionId 。为了管理不同用户的session对象,服务器会以sessionId 为键,session对象为值的方式,存放于服务器管理session的Map集合。产生响应时,服务器会将sessionId 以Set-Cookie 响应头的方式发送给客户端。

客户端再次请求服务器,会将 sessionId 再以 Cookie 请求头的方式发送给服务器。服务器得到sessionId后,从Map集合中,得到对应的session 对象,从而跟踪用户状态。


创建/获得 session

//如果有存放该用户信息的session对象,则直接取出,否则为该用户创建session对象
HttpSession session = request.getSession();

在session中绑定/获取共享数据

//在session中绑定共享对象,在一个会话范围内共享
session.setAttribute("userName","tom");
//从session中取出共享对象
Object obj = session.getAttribute("userName");

session 的销毁

http是无状态协议,当用户关闭浏览器下线时,服务器并不清楚。因而还会保留分配给该用户的session对象。所以,关闭浏览器,并不意味着session 对象的销毁。 如果不及时清理这种过期的session 对象,服务器的内存会持续的占用,持续的消耗,最终导致服务器崩溃。

消耗session的方式:

1、设置过期时间

//设置过期时间,从用户最后一次访问服务器的时间开始,到当前时间为止。
//如果超过过期时间,服务器就会认为客户端已经下线,从而销毁为该用户分配的session对象。
session.setMaxInactiveInterval(1800);
时间描述:默认为正,负以-开头,紧接着P,(字母不区分大小写)
D :天
T:天和小时之间的分隔符
H :小时
M:分钟
S:秒
每个单位都必须是数字,且时分秒顺序不能乱。
springBoot 中设置 session 过期时间。
server:servlet:session:timeout: PT10M

2、调用 invalidate()强行销毁 session

session.invalidate();

3、应用程序结束或服务器崩溃


session 和 cookie 的区别

1、session 是服务器端的对象,cookie是服务器发送给客户端的一段文本。

2、在session 中可以绑定共享对象,而cookie 信息只能传输文本。

3、cookie 在客户端和服务器之间传输的是具体的数据。而session 在客户端和服务器之间之间只传输sessionId,数据较安全。


URL 重写

由于使用cookie 会存在一些安全隐患,有些用户会在客户端浏览器对cookie 进行禁用。这样,当使用session进行会话跟踪时,由于不能使用cookie,那么也就无法通过cookie方式向服务器发送 sessionId。 服务器得到不sessionId,就认为这是新用户,从而会重新分配新的session 对象。导致无法进行状态跟踪。

解决方法是URL 重写。在访问服务器时,在URL 路径中,附加sessionId。这样,即使客户端禁用了cookie ,服务器同样可以得到sessionId,从而跟踪状态。

<a href="/project;jsessionid=FDSF787S9F979S7F98S79F7S98">cllck</a>

在服务器端,可以调用response 的 encodeRedirectURL()方法,对请求的URL 重新进行编写,从而附加sessionId 信息。

response.encodeRedirectURL("/project/sucess.html")

WEB服务器状态跟踪相关推荐

  1. 监听web服务器状态,处理监听fd的流程 - web服务器lighttpd1.4.18代码详细分析_Linux编程_Linux公社-Linux系统门户网站...

    //接收一个新的连接connection*connection_accept(server*srv, server_socket*srv_socket) {/*accept everything*// ...

  2. html巡检脚本,WEB服务器巡检脚本

    脚本功能: 监控多台Web服务器状态,一旦发生问题就发送邮件 运行环境: Python2.7/2.4皆可运行 脚本使用方法: 可利用Crontab或者计划任务来指定时间运行,例如: */10 * * ...

  3. web服务器监控(一)

    程序截图 原理 定时任务,通过与监控URL建立连接来判断web服务器状态,如果异常,发送邮件通知,如果是139邮箱,同时可接收到手机短信.最终发布时使用fatjar打包,通过one-jar可以将lib ...

  4. 在Linux中检查Apache服务器状态和正常运行的3种方法

    转自:https://www.howtoing.com/check-apache-httpd-status-and-uptime-in-linux Apache是世界上最受欢迎的跨平台HTTP Web ...

  5. 查询网站使用什么web服务器

    linux curl是通过url语法在命令行下上传或下载文件的工具软件,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控Web服务器状态.一.Linux c ...

  6. arduino服务器_如何使用Arduino检查Web服务器的响应状态

    arduino服务器 by Harshita Arora 通过Harshita Arora 如何使用Arduino检查Web服务器的响应状态 (How to use Arduino to check ...

  7. nginx两台文件服务器集群,keepalived结合nginx状态检测脚本实现对web服务器集群的高可用...

    实验环境 两台CentOS-7.5虚拟机 web1:10.0.11.203 web2:10.0.11.204 VIP :10.0.11.210 web类型:nginx 客户端:自用笔记本(win10) ...

  8. 《jQuery与JavaScript入门经典》——第 1 章 动态Web编程简介 1.1理解Web服务器浏览器范式...

    本节书摘来自异步社区<jQuery与JavaScript入门经典>一书中的第1章,第1.1节,作者:[美]Brad Dayley著,更多章节内容可以访问云栖社区"异步社区&quo ...

  9. 嵌入式设备web服务器比较

    现在在嵌入式设备中所使用的web服务器主要有:boa.thttpd.mini_httpd.shttpd.lighttpd.goaheand.appweb和apache等. Boa 1.介绍 Boa诞生 ...

最新文章

  1. SAP库存表之间的逻辑关系
  2. (五)OpenStack---M版---双节点搭建---Nova安装和配置
  3. python限定方法参数类型、返回值类型、变量类型
  4. 二十三、“为天下人谋幸福,才是真正的大事。”(2021.7.9)
  5. 【NLP】NLP爱好者学习资源推荐汇总
  6. 洛谷P1204 [USACO1.2]挤牛奶Milking Cows 前缀和
  7. (转)Nginx反向代理设置 从80端口转向其他端口
  8. 马斯克谈买比特币:当法币实际利率为负时 只有“傻子”才不放眼他处
  9. 高等组合学笔记(六): 第二类Stirling数,第一类Stirling数以及生成函数
  10. weblogic 12 开启debug端口配置
  11. Cookie 和 Session 规则
  12. Redis的lua脚本
  13. PS教程证件照底片更换颜色
  14. 撰写SCI论文好用的免费工具(下) - 易智编译EaseEditing
  15. 切勿忽视晶振的选型设计!
  16. Kafka 入门 (一)
  17. php和mysql入门
  18. 手机网络应用客户端软件开发实践简介
  19. 我下载了python所有包,24个G,用以备份
  20. Ubuntu16.04 python安装

热门文章

  1. Android实战 - 音心播放器 (MusicListActivity - 音乐播放和MainActivity的一个问题)
  2. TINA TI 二阶滤波器仿真
  3. 【转】Latex的几种参考文献排序
  4. 一套即学即用,受益终身的效率思维
  5. Android项目:手机安全卫士(6)—— 手机防盗设置向导
  6. [程序设计]基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。
  7. 学习前端我推荐这5本书
  8. Python开发一个滑雪小游戏
  9. LAGRANGIAN FLUID SIMULATION WITH CONTINUOUS CONVOLUTIONS
  10. 如何使用jmeter测试app端口的md5加密接口