Jetty 配置 Session
什么是 Session?
Session 是 Web 应用程序中用于跟踪用户会话状态的一种机制,它允许服务器存储和检索与特定用户相关的信息,即使在多个请求之间也能保持会话状态,在 Jetty 中,Session 通过 org.eclipse.jetty.server.SessionManager 类来管理。
Jetty 中 Session 的配置
Session 管理器配置
在 Jetty 中,Session 管理器是通过 org.eclipse.jetty.server.SessionManager 类实现的,以下是一个基本的 Session 管理器配置示例:
SessionManager sessionManager = new SessionManager(new HashSessionIdManager());sessionManager.setMaxInactiveInterval(1800); // 设置 Session 无操作超时时间为 30 分钟sessionManager.setSessionCookie("JSESSIONID"); // 设置 Session Cookie 名称sessionManager.setCookiePath("/"); // 设置 Session Cookie 路径sessionManager.setCookieMaxAge(1800); // 设置 Session Cookie 最大存活时间,单位为秒
Session 数据存储配置
Session 数据存储是用于存储 Session 数据的地方,在 Jetty 中,可以使用以下方式配置 Session 数据存储:
(1)内存存储
SessionDataStore sessionDataStore = new MemorySessionDataStore();sessionManager.setSessionDataStore(sessionDataStore);
(2)持久化存储
SessionDataStore sessionDataStore = new DiskSessionDataStore("path/to/session/data");sessionManager.setSessionDataStore(sessionDataStore);
Session 监听器配置
在 Jetty 中,可以通过实现 org.eclipse.jetty.server.SessionListener 接口来监听 Session 事件,以下是一个 Session 监听器配置示例:
SessionListener sessionListener = new SessionListener() {@Overridepublic void sessionCreated(Session session) {System.out.println("Session created: " + session.getId());}@Overridepublic void sessionDestroyed(Session session) {System.out.println("Session destroyed: " + session.getId());}@Overridepublic void sessionExpired(Session session) {System.out.println("Session expired: " + session.getId());}@Overridepublic void sessionAttributeAdded(Session session, String attribute) {System.out.println("Attribute added: " + attribute);}@Overridepublic void sessionAttributeremoved(Session session, String attribute) {System.out.println("Attribute removed: " + attribute);}@Overridepublic void sessionAttributeReplaced(Session session, String attribute) {System.out.println("Attribute replaced: " + attribute);}};sessionManager.addListener(sessionListener);
本文介绍了 Jetty 中 Session 的配置方法,包括 Session 管理器、Session 数据存储和 Session 监听器,在实际应用中,根据需求选择合适的配置方式,以确保应用程序的性能和稳定性。
问题1:如何设置 Session 无操作超时时间?
解答:在 Session 管理器配置中,使用
setMaxInactiveInterval()
方法设置 Session 无操作超时时间,参数为秒,
sessionManager.setMaxInactiveInterval(1800);
设置为 30 分钟。
问题2:如何监听 Session 事件?
解答:通过实现 org.eclipse.jetty.server.SessionListener 接口并实现相关方法,可以将实例作为监听器添加到 Session 管理器中,使用
sessionManager.addListener(sessionListener);
将监听器添加到 Session 管理器。
nero刻录音乐CD 在我的CD机上播放,不知是用哪一种写入方是 是用光盘一次刻录 还是 光盘一次刻录/96。
一次写盘(Disk At Once) 一次写盘方式(Disk At Once),一般缩写为DAO。 一次写盘是单次的写入方式,引导区、数据磁道以及导出区都是一次性写入,一次写完之后光盘就关闭,即便此次写入没有写满整个刻录盘,也无法再写入其它数据。 当引导区写入到光盘上时,并没有在该引导区标示出下一个可用的地址,因此光盘就被视为关闭,再就无法写入更多的数据。 这种写入模式主要用于光盘的复制,一次完成整张光盘的刻录。 其特点是能使复制出来的光盘与源盘毫无二致。 DAO写入方式可以轻松完成对于音乐CD、混合或特殊类型CD-ROM等数据轨之间存在间隙的光盘的复制,且可以确保数据结构与间隙长度都完全相同。 值得一提的是,由于DAO写入方式把整张光盘当作一个区段来处理,一些小的失误都有可能导致整张光盘彻底报废,所以它对数据传送的稳定性和驱动器的性能有较高的要求。 轨道写入(Track At Once) 轨道写入方式(Track At Once),一般缩写为TAO,与DAO的单次写入不同,TAO是种多次写入的方式。 TAO是以轨为单位的写入方式,在一个写入过程中逐个写入所有轨道,如果多于一个轨道,则在上一轨道写入结束后再写下一轨道,且上一轨道写入结束后不关闭区段。 因为是用这种方式刻录各个轨道,也就是说刻录前一轨道结束后,激光头要关闭,刻录下一轨道时再将其打开。 因此,以TAO方式刻录的轨道之间有间隔缝隙。 如果是数据轨道和音轨之间,则间隔为2到3秒,如果是音轨之间则间隔为2秒。 这一点对于刻录数据光盘没有影响。 以TAO方式写入时,可以选择不关闭区段,以后还可以添加轨道到光盘的这一区段,一般用于音乐CD的刻录,而对数据光盘无效。 没有关闭区段的音乐CD不能在CD或VCD播放机上播放,没有关闭的区段可以在刻录软件中进行关闭,关闭后就可以在CD或VCD播放机上播放了。 TAO模式主要应用于制作音乐光盘或混合、特殊类型的光盘。 区段写入(Session At Once) 区段写入方式(Session At Once),一般简写为SAO。 这种写入模式一次只刻录一个区段而非整张光盘,余下的光盘空间下次可以继续使用;常用于多区段CD-ROM的制作。 其优点是适合于制作合辑类型的光盘。 但每次刻录新区段时都要占用约13MB左右的光盘空间用于存储该区段的结构以及上一区段的联接信息,并为建立下个区段作好准备。 因此区段过多会浪费较多的光盘空间。 飞速写入(On The Fly) 飞速写入方式(On The Fly),一般简写为OTF。 一种很常用的写入方式,在早期,由于计算机运算速度无法满足要求,所以只能在刻录前将数据预先转换成使用ISO-9660格式的Image File(映像文件),然后再进行刻录;目前的电脑处理速度已经可以实现完全实时转换,这种将数据自动实时转换成ISO-9660格式,然后进行烧录的方式就叫飞速写入。 多区段写入(Multi Session) 多区段写入方式(Multi Session),一般简写为MS。 每个刻录过程只刻录并且关闭一个区段,剩余空间下次可以继续刻录下一区段。 因此,往往光盘上存在多个区段,称为多区段光盘。 如果光盘中只有一个区段,但光盘没有关闭,也可成为多区段光盘。 这种方式多用于数据光盘的刻录,方便之处在于不必一次刻满整盘。 数据包写入(Packet Writing) 数据包写入是一种磁道内多次写入的方式,可以有效的减少刻录盘空间的浪费。 每个数据包使用4个扇区,一个用作“进入”、2个用作“离开”、一个用作“链接”。 数据报可以固定大小,也可以调整,不过大多数的刻录机和刻录软件都使用固定大小的数据包,这样会在处理文件系统时更为方便、有效。 数据包写入通常使用UDF(Universal Disk Format,通用磁盘各式)文件系统,不过直到WINdows2000都不直接支持数据包写入或UDF文件系统,必须要加载一些特殊的驱动程序。
OSI参考模型和TCP/IP协议的相同点
ISO/IEC 是 国 际 标 准 化 组 织 和 国 际 电 工 委 员 会 的 英 文 缩 写, 它 是 致 力 于 国 际 标 准 的、 自 愿 和 非 赢 利 的 专 门 机 构。 最 著 名 的OSI 标 准 是ISO/IEC 7498, 亦 称 为X.200 建 议。 该 体 系 结 构 标 准 定 义 了 异 质 系 统 互 联 的 七 层 框 架, 也 称 为OSI 参 考 模 型。 基 于 此 框 架, 各 协 议 规 范 可 进 一 步 详 细 地 规 定 每 一 层 的 功 能, 而 每 一 层 使 用 下 层 提 供 的 服 务, 并 向 其 上 一 层 提 供 服 务。 ---- ★ 物 理 层(Physical Layer)---- 提 供 机 械、 电 气、 功 能 和 过 程 特 性。 如 规 定 使 用 电 缆 和 接 头 的 类 型, 传 送 信 号 的 电 压 等。 在 这 一 层, 数 据 还 没 有 被 组 织, 仅 作 为 原 始 的 位 流 或 电 气 电 压 处 理。 ---- ★ 数 据 链 路 层(Data Link Layer)---- 实 现 数 据 的 无 差 错 传 送。 它 接 收 物 理 层 的 原 始 数 据 位 流 以 组 成 帧( 位 组), 并 在 网 络 设 备 之 间 传 输。 帧 含 有 源 站 点 和 目 的 站 点 的 物 理 地 址。 ---- ★ 网 络 层(Network Layer)---- 处 理 网 络 间 路 由, 确 保 数 据 及 时 传 送。 将 数 据 链 路 层 提 供 的 帧 组 成 数 据 包, 包 中 封 装 有 网 络 层 包 头, 其 中 含 有 逻 辑 地 址 信 息 — — 源 站 点 和 目 的 站 点 地 址 的 网 络 地 址。 ---- ★ 传 输 层(Transport Layer) 提 供 建 立、 维 护 和 取 消 传 输 连 接 功 能, 负 责 可 靠 地 传 输 数 据。 ---- ★ 会 话 层(Session Layer)---- 提 供 包 括 访 问 验 证 和 会 话 管 理 在 内 的 建 立 和 维 护 应 用 之 间 通 信 的 机 制。 如 服 务 器 验 证 用 户 登 录 便 是 由 会 话 层 完 成 的。 ---- ★ 表 示 层(Presentation Layer)---- 提 供 格 式 化 的 表 示 和 转 换 数 据 服 务。 如 数 据 的 压 缩 和 解 压 缩, 加 密 和 解 密 等 工 作 都 由 表 示 层 负 责。 ---- ★ 应 用 层(Application Layer)---- 提 供 网 络 与 用 户 应 用 软 件 之 间 的 接 口 服 务。 TCP/IP协议TCP/IP协议并不完全符合OSI的七层参考模型。 传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。 该模型的目的是使各种硬件在相同的层次上相互通信。 这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。 而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。 这4层分别为:应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(ftp)、网络远程访问协议(Telnet)等。 传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。 互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。 网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
如何区分HTTP协议的无状态和长连接?
HTTP是无状态的也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话 HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。 如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。 保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。 实现长连接要客户端和服务端都支持长连接。 所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接短连接:比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。 长连接:有些服务需要长时间连接到服务器,比如CMPP,一般需要自己做在线维持。 最近在看“服务器推送技术”,在B/S结构中,通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新信息(比如股票价格),这样可以节省大量的带宽。 传统的轮询技术对服务器的压力很大,并且造成带宽的极大浪费。 如果改用ajax轮询,可以降低带宽的负荷(因为服务器返回的不是完整页面),但是对服务器的压力并不会有明显的减少。 而推技术(push)可以改善这种情况。 但因为HTTP连接的特性(短暂,必须由客户端发起),使得推技术的实现比较困难,常见的做法是通过延长http 连接的寿命,来实现push。 接下来自然该讨论如何延长http连接的寿命,最简单的自然是死循环法:【servlet代码片段】public void doGet(Request req, Response res) {PrintWriter out = ();……正常输出页面……();while (true) {(输出更新的内容);();(3000);} }如果使用观察者模式则可以进一步提高性能。 但是这种做法的缺点在于客户端请求了这个servlet后,web服务器会开启一个线程执行servlet的代码,而servlet由迟迟不肯结束,造成该线程也无法被释放。 于是乎,一个客户端一个线程,当客户端数量增加时,服务器依然会承受很大的负担。 要从根本上改变这个现象比较复杂,目前的趋势是从web服务器内部入手,用nio(JDK 1.4提出的包)改写request/response的实现,再利用线程池增强服务器的资源利用率,从而解决这个问题,目前支持这一非J2EE官方技术的服务器有Glassfish和Jetty(后者只是听说,没有用过)














发表评论