Servlet 入门到精通(五)

本文介绍了Web开发中用于会话跟踪的几种技术,包括URL重写、隐藏域表单、Cookie和Session。重点讲解了Cookie的工作原理,它是如何帮助服务器在HTTP无状态协议下识别用户身份的。同时,也提到了Session的概念,它是如何在服务器端保存用户状态的。通过设置Cookie的时效性和利用SessionId,服务器可以有效地管理和识别不同的用户会话。
摘要由CSDN通过智能技术生成

上一篇博客的传送门:Servlet 入门到精通(四)

什么是会话

会话是指一个终端用户与交互系统进行通讯的过程,简单的说说就是浏览器和服务器之间的一次通话,它包含了多次的请求和响应。例如你给 10086 打个电话,你就是客户端浏览器,而10086 服务人员就是服务器了。从对方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向 10086 发出多个请求,那么这多个请求都在一个会话中。

什么是会话跟踪

HTTP 协议是无状态的协议。一旦数据交换完毕,客户端浏览器与服务器的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。并且每次请求都是独立的,无法记录前一次请求的状态。而会话跟踪是 Web 程序中常用的一种技术,用来跟踪用户的整个会话。常用的会话跟踪技术分别是url重写、隐藏域表单、Cookie 和 Session。

会话跟踪有哪些技术

URL 重写

URL 可以在具体资源后以 ? 形式附加参数,和服务器的请求一起发送,服务器可以通过请求来接收传递过来的参数内容,并以此实现值之间的传递来达到共享的方式。

<script>
    function convertName(yn) {
        yn = encodeURI(yn); 
        location.href = "../url?name=" + yn;
    }
</script>
<a href="../url?id=1">发送内容到控制器1</a><br/>
<a href="../url?id=1&name=admin">发送内容到控制器2</a><br/>
<a href="../url?id=1&name=admin&love=zuqiu&love=lanqiu">发送内容到控制器3</a><br/>
<a href="../url?name=张三">发送内容到控制器4</a><br/>
<a href="javascript:convertName('张三')">改写上边4的情况</a>

隐藏域表单

隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的。当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上。

<form action="guanwei" method="post">
    <input type="text" name="name"/>
    <input type="hidden" name="id" value="1"/>
    <button>修改用户</button>
</form>

上边案例提供了修改对应用户姓名的功能,用户只需输入新名字。在发送表单时,浏览器会将用户输入的名称和隐藏下来的 ID 一起传送到指定资源。

隐藏域的好处

  • 有些时候我们要给用户一信息,让他在提交表单时提交上来以确定用户身份,如id等。
  • 有些时候一个 form 里有多个提交按钮,怎样使程序能够分清楚到底用户是按那一个按钮提交上来的呢?我们就可以写一个隐藏域,然后在每一个按钮处加上οnclick=”document.form.command.value=”xx”“ 然后我们接到数据后先检查 command 的值就会知道用户是按的那个按钮提交上来的。
  • 有时候一个网页中有多个form,我们知道多个form是不能同时提交的,但有时这些form确实相互作用,我们就可以在form中添加隐藏域来使它们联系起来。
  • javascript不支持全局变量,但有时我们必须用全局变量,我们就可以把值先存在隐藏域里,它的值就不会丢失了。
  • 还有个例子,比如按一个按钮弹出四个小窗口,当点击其中的一个小窗口时其他三个自动关闭.可是IE不支持小窗口相互调用,所以只有在父窗口写个隐藏域,当小窗口看到那个隐藏域的值是close时就自己关掉。

cookie 技术

由于 HTTP 是一种无状态的协议,服务器单从网络连接上无从知道客户身份。用户 A 购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户 A 的会话还是用户 B 的会话了。

怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是 Cookie 的工作原理。

Cookie 实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用 response 向客户端浏览器颁发一个 Cookie 。客户端会把 Cookie 保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该 Cookie 一同提交给服务器。服务器检查该 Cookie ,以此来辨认用户状态。服务器还可以根据需要修改 Cookie 的内容。

1. 如何保持 cookie

// 只是在内存中产生了一个对象
Cookie c1 = new Cookie("MESSAGE_1", "guanwei");
// 设置cookie在硬盘中保存时效,单位是秒,如不写则是临时存储 session 关闭后就失效了 -1代表永久存储
c1.setMaxAge(60 * 60);
// 保存
response.addCookie(c1);

2. 如何获取 cookie

// 获取到当前服务器在浏览器中存放的cookie信息
Cookie[] cookies = request.getCookies();

当我们访问浏览器的时候,浏览器会发送一个 HTTP 请求到服务器端,服务器会发送一个 HTTP 响应到客户端,其中包括 Cookie,意思就是浏览器建立一个 cookie 保存服务器指定的内容,比如用户信息和用户操作信息。

浏览器保存好信息之后,下次我们再次访问网站的时候,浏览器再发送 HTTP 请求到服务器端时都会携带之前保存的cookie,服务器端会从收到的 cookie 中识别用户身份,就能让页面为你提供专门属于你的内容了。 

session 技术

Session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是 Session。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。

每个用户访问服务器都会建立一个 session ,那服务器是怎么标识用户的唯一身份呢?事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个 SessionId ,服务器会将 sessionId 以 cookie 的方式发送给浏览器。当浏览器再次访问服务器时,会将 sessionId 发送过来,服务器依据 sessionId 就可以找到对应的 session 对象。

下一篇我们讲解 Servlet 中的过滤器:Servlet 入门到精通(六)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值