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")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值