WEB服务器状态跟踪
状态跟踪
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服务器状态跟踪相关推荐
- 监听web服务器状态,处理监听fd的流程 - web服务器lighttpd1.4.18代码详细分析_Linux编程_Linux公社-Linux系统门户网站...
//接收一个新的连接connection*connection_accept(server*srv, server_socket*srv_socket) {/*accept everything*// ...
- html巡检脚本,WEB服务器巡检脚本
脚本功能: 监控多台Web服务器状态,一旦发生问题就发送邮件 运行环境: Python2.7/2.4皆可运行 脚本使用方法: 可利用Crontab或者计划任务来指定时间运行,例如: */10 * * ...
- web服务器监控(一)
程序截图 原理 定时任务,通过与监控URL建立连接来判断web服务器状态,如果异常,发送邮件通知,如果是139邮箱,同时可接收到手机短信.最终发布时使用fatjar打包,通过one-jar可以将lib ...
- 在Linux中检查Apache服务器状态和正常运行的3种方法
转自:https://www.howtoing.com/check-apache-httpd-status-and-uptime-in-linux Apache是世界上最受欢迎的跨平台HTTP Web ...
- 查询网站使用什么web服务器
linux curl是通过url语法在命令行下上传或下载文件的工具软件,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控Web服务器状态.一.Linux c ...
- arduino服务器_如何使用Arduino检查Web服务器的响应状态
arduino服务器 by Harshita Arora 通过Harshita Arora 如何使用Arduino检查Web服务器的响应状态 (How to use Arduino to check ...
- 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) ...
- 《jQuery与JavaScript入门经典》——第 1 章 动态Web编程简介 1.1理解Web服务器浏览器范式...
本节书摘来自异步社区<jQuery与JavaScript入门经典>一书中的第1章,第1.1节,作者:[美]Brad Dayley著,更多章节内容可以访问云栖社区"异步社区&quo ...
- 嵌入式设备web服务器比较
现在在嵌入式设备中所使用的web服务器主要有:boa.thttpd.mini_httpd.shttpd.lighttpd.goaheand.appweb和apache等. Boa 1.介绍 Boa诞生 ...
最新文章
- SAP库存表之间的逻辑关系
- (五)OpenStack---M版---双节点搭建---Nova安装和配置
- python限定方法参数类型、返回值类型、变量类型
- 二十三、“为天下人谋幸福,才是真正的大事。”(2021.7.9)
- 【NLP】NLP爱好者学习资源推荐汇总
- 洛谷P1204 [USACO1.2]挤牛奶Milking Cows 前缀和
- (转)Nginx反向代理设置 从80端口转向其他端口
- 马斯克谈买比特币:当法币实际利率为负时 只有“傻子”才不放眼他处
- 高等组合学笔记(六): 第二类Stirling数,第一类Stirling数以及生成函数
- weblogic 12 开启debug端口配置
- Cookie 和 Session 规则
- Redis的lua脚本
- PS教程证件照底片更换颜色
- 撰写SCI论文好用的免费工具(下) - 易智编译EaseEditing
- 切勿忽视晶振的选型设计!
- Kafka 入门 (一)
- php和mysql入门
- 手机网络应用客户端软件开发实践简介
- 我下载了python所有包,24个G,用以备份
- Ubuntu16.04 python安装
热门文章
- Android实战 - 音心播放器 (MusicListActivity - 音乐播放和MainActivity的一个问题)
- TINA TI 二阶滤波器仿真
- 【转】Latex的几种参考文献排序
- 一套即学即用,受益终身的效率思维
- Android项目:手机安全卫士(6)—— 手机防盗设置向导
- [程序设计]基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。
- 学习前端我推荐这5本书
- Python开发一个滑雪小游戏
- LAGRANGIAN FLUID SIMULATION WITH CONTINUOUS CONVOLUTIONS
- 如何使用jmeter测试app端口的md5加密接口