四种会话跟踪技术

什么是会话?
客户端打开与服务器的连接,发出请求直到服务器响应客户端请求的全过程称之为会话 。

为什么需要会话跟踪?
浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以实现这种要求 。

会话跟踪的4种方法是什么?
1、通过Cookie实现
2、通过session实现
3、URL地址重写
4、表单隐藏域

1、Cookie
        Cookie不是内置对象,需要自己创建Cookie的实例。是服务器往客户端写的一段文本信息,该信息是可以修改的,所以一般情况cookie会存储一些非敏感信息,当客户端再次请求服务器的时候,会将Cookie以请求头的方式发送到服务器,这个时候服务器就能区分是谁在访问了。

Cookie cookie = new Cookie(“键”, “值”); //创建cookie
cookie.setMaxAge(606024); //设置cookie的有效期
cookie.setPath("/"); //设置cookie的有效范围(路径)
response.addCookie(cookie); //将cookie写入到客户端
1
2
3
4
2、session
        session 是存放在服务器端的,更加安全。每一个用户都有一个不同的session,各个用户之间是不能共享的。
        服务器端会创建一个session对象,并且产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端通过这个sessionID进行不同的用户识别 。
        Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效 。

session.setAttribute(String name,Object obj); //往session中存放内容(通过键和值的形式)
session.getAtrribute(String name); //通过键从session中获取内容
session.removeAttribute(String name); //把存储在session中的对象移除
session.invalidate(); //销毁session
1
2
3
4
销毁session
        当客户端长时间不向服务器发送请求后,session对象会自动消失,但对于某些实时统计在线人数的网站,每次都等session过期后才能统计出准确的人数就不行,必须要手动销毁session。
        当session被销毁后,在调用session对象的任何方法,都会报出Session already invalidated异常

设置session有效期的三种方式:
tomcat->config->web.xml中设置30的值
当前项目的web.xml中设置30的值
通过代码设置session.setMaxInactiveInterval(30);

会话超时管理
getLastAccessesTime():返回客户端最后一次与会话相关联的请求时间
getMaxInactiveInterval():以秒为单位返回一个会话内两个请求最大的时间间隔
setMaxInactiveInterval():一秒为单位设置session的有效时间

3、URL地值重写
      Session是基于cookie的 ,cookie 被禁用session就不会起作用。在cookie被禁用的时候就需要URL地址重写来解决这个问题了。
       这个时候客户端浏览器向服务器发出请求时,会在URL地址后面加上类似于“sessionID=*”形式的参数,服务器端通过获取sessionID关键字来获取会话值来判断是哪个用户发送的请求。
      但是在程序第一次访问服务器端时,服务端并不能确认客户端浏览器是否支持Cookie。因此,当服务器第一次发出请求时,服务端会默认采用URL重写,也就是将SESSIONID写到URL地址中传递。
      之后当客户端发送请求后,服务器会根据提交给客户端浏览器的信息自动检查客户端是否启用了Cookie,如果启用,将不再进行URL重写。如果没有,则继续使用URL重写。

String sessionId = request.getRequestedSessionId(); //获得sessionId
1
通过response对象的encodeURL(StringURL)实现URL地值重写:

<a href="<%=response.encodeURL(“index.jsp”) %>">
index页面
1
2
该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会调用encodeURL()方法之后会自动将用户Session的id重写到URL中。重写后的输出可能是这样的:

a href=“index.jsp?jsessionid=0E0C61100AEB06DE6A95EB1CD1DA8158”>index页面
1
HttpServletResponse接口定义了两个用于URL重写的方法:
encodeURL方法,用于超链接和form表单的action属性中设置的URL进行重写
encodeRedirectURL 方法 用于对传递给HttpServletResponse.sendRedirect()方法的URL进行重写
他们根据请求消息中是否含有Cookie头字段来决定是否进行url重写。把URL作为参数传递给这两个方法,他们就能完成url重写,在url后面添加 jsessionid参数及其值。可以关闭浏览器的Cookie,然后,进行实验,在网页源文件中查看URL后面是否有jsessionid参数及其值。

4、隐藏表单域
通过进行信息的传递 。通过表单形式提交到服务器,但是本身不显示。
比如第二个表单中获取第一个表单中的内容,并以隐藏域( 文本框type为 hidden) 的方式接受第一个表单中的内容,再次传递到第三个表单中。通俗点说请求的顺序是这样的:表单一 - - > 表单二 - - >表单三,但是表单三需要用到表单一提交的内容,所以就会需要表单二作为过渡,把表单一的内容以隐藏域的形式保存,然后再传递到表单三中。
————————————————
版权声明:本文为CSDN博主「Dannii_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36748278/article/details/77725837

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值