Servlet--会话跟踪

HTTP是有一种无状态的协议,形象的说,就是大家在交流(发送/处理请求)的时候,无法识别谁在说话。
本文的前半部分会介绍基于CGI开发者使用的传统会话跟踪技术:用户鉴别、隐藏表单字段、URL重写和持续性cookie,后半段介绍Servlet API中对会话跟踪的内置支持。
本章主要介绍单服务器的状态,在《企业服务和J2EE》中将介绍多服务处理共享会话状态。

用户鉴别

在客户登陆进入后,servlet可以使用getRemoteUser()取得用户名。
我们可以使用用户名来跟踪客户端会话。用户登陆后,浏览器记住用户名并且在浏览新网页时重发名称和密码。serlvet通过用户名对用户进行鉴别并跟踪会话。举个简单的例子,一个用户在他的购物车上增加一项,这个信息就被记录(比如数据库中),以后用户结账的时候,另一个servlet调用数据库中的信息就可以了。
这个方法最大优点是容易实现。
最大的缺点是需要用户登陆账号,比较麻烦。另一个缺点是HTTP的基本鉴别没有提供注销技术,用户必须关闭浏览器以注销(当然我们现在都有登出操作了)。最后一个问题是,用户不能对一个网点进行多个会话。我们需要支持匿名会话跟踪和注销的鉴别技术。

隐藏的表单字段

支持匿名会话跟踪的一个方法是使用隐藏的表单字段。顾名思义,就是用HTML表当上不在客户端显示的字段,它们在表单提交后被返回到服务器。可以像这样使用它:

<FORM ACTION="/servlet/MovieFinder" METHOD="POST">
...
<INPUT TYPE=hidden NAME="zip" VALUE="94040">
<INPUT TYPE=hidden NAME="level" VALUE="expert">
...
</FORM>

在某种意义上,隐藏的表单字段为表单定义了一个常数常量。对于一个servlet而言,隐藏字段和可见字段没有区别。
隐藏表单字段的优点在于普遍性和对匿名的支持。隐藏字段被所有流行的浏览器支持,它们不需要服务器特殊服务,并且它们可以用于未注册和登陆的客户端。该技术的主要缺点是会话只能存在于动态生成的表单中。会话不能在静态文本、发送的文档、书签文档和在浏览器关闭时存在。

URL重写

URL重写是支持匿名会话跟踪的另一个方法。使用URL重写技术,每个可能被用户点击的本地URL都会被动态修改,或重写以包含附加信息。附加信息可能是附加路径信息、附加参数或定制的服务器端指定的URL变换形式。在URL重写中,附加信息通常是一个独特的会话ID。例如:

http://server:port/servlet/Rewritten                 original
http://server:port/servlet/Rewritten/123             extra path information
http://server:port/servlet/Rewritten?sessionid=123   added parameter
http://server:port/servlet/Rewritten;jsessionid=123  custom change

持续性cookie

cookie是一些由服务器发向浏览器并且还能由浏览器读回的信息。当浏览器收到一个cookie,就将这个cookie保存起来,并当每次它访问该服务器的网页时,都将这个cookie发送回服务器。因为一个cookie的值可以唯一确定一个客户端,所以cookie常用于会话跟踪。

使用cookie

servlet API提供了javax.servlet.http.Cookie类来运行cookie。cookie的HTTP首部有关细节处理由Servlet API进行。我们可以用Cookie()构造函数来生成一个cookie:

 public Cookie(String name, String value)

通过在请求的防止中AddCookie()方法向客户端发送一个cookie,并且能用AddCookie()继续添加。浏览器对每个网站最多接受20个cookie,每个用户最多300个,并且浏览器将每个cookie设置在4096字节内。

 public void HttpServletResponse.addCookie(Cookie cookie)

会话跟踪API(Session)

Servlet API提供了一些方法和类专门处理短期的会话跟踪。

会话跟踪基础

网站的每个用户都和javax.servlet.http.HttpSession对象有关,servlet使用这个对象来记录和检索每个用户的信息。

    public HttpSession HttpServletRequest.getSession(boolean create)

会话的生命周期

会话并不是一直延续下去的。会话在非活动固定时间(Tomcat默认30分钟)后自动关闭,或者由servlet关闭。

设定会话超时

理论上讲,会话将在用户关闭浏览器时失效,连接到其他网站或用户离开。但是,服务器无法检测到这些事件。因此,服务器在会话不活动一段时间后就假设用户已经离开,不再需要保持会话了。
默认的会话超时可使用web.xml来自定义。

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">

<web-app>
    <!-- ..... -->
    <session-config>
        <session-timeout>
            60 <!-- minutes -->
        </session-timeout>
    </session-config>
</web-app>

或者对HttpSession对象设置一个超时时间

    public void HttpSession.setMaxInactiveInterval(int secs)

给出一个负值表示不会超时。

会话如何工作

当用户第一次访问一个Web应用程序,用户被分配一个HttpSession对象和一个唯一的会话ID。这个会话ID代表用户并用于和后边请求中的HttpSession相匹配。有些服务器使用一个会话ID,每个应用程序将这个ID映射到一个不同的HttpSession实例。有些服务器则会为每个Web应用程序分配一个会话ID,用来预防恶意入侵者模拟用户来破坏Web应用程序。
在后台,会话ID通常保存在客户端一个叫做JSESSIONID的cookie中。

会话绑定事件

一些对象希望在被绑定在会话和从会话中释放时都能有所动作。例如,一个数据库连接可能在绑定在会话上时开始一个传输,并在被释放时结束传输。任何实现了javax.servlet.http.HttpSessionBindingListener接口都从会话绑定或释放时被通知。这个接口实现了两个方法,valueBound()和valueUnbound()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: javax.servlet-api 3.0.1是Java Servlet规范的一个实现,它是JavaEE的一部分,用于开发基于HTTP协议的Web应用程序。 javax.servlet-api 3.0.1提供了一系列的类和接口,用于处理HTTP请求和响应。它定义了Servlet和相关的API,包括Servlet容器、Session管理、过滤器、监听器等。开发人员可以使用这些API来编写Servlet,处理来自客户端的请求,并生成响应。 通过使用javax.servlet-api 3.0.1,开发人员可以创建具有动态功能的Web应用程序。例如,他们可以接收用户表单提交的数据,处理并返回结果。他们还可以访问HTTP请求的头部信息、请求参数、Cookie等,并根据需要执行相应的操作。 此外,javax.servlet-api 3.0.1还简化了Web应用程序的开发和部署。它提供了一套标准的API和规范,保证了Web应用程序的可移植性。无论是部署在任何支持Servlet规范的容器中,都可以保证Web应用程序的运行。 总结来说,javax.servlet-api 3.0.1是一个用于开发基于HTTP协议的Web应用程序的Java库。它提供了一套标准的API和规范,简化了Web应用程序的开发和部署,并且具有高度的可移植性和灵活性。 ### 回答2: javax.servlet-api 3.0.1 是 Java Servlet 规范的一个实现。Java Servlet 是 JavaEE(现在的 Jakarta EE)规范中的一部分,用于开发基于Java的Web应用程序。 javax.servlet-api 3.0.1 提供了一套类和接口,用于处理 HTTP 请求和响应。它定义了 Servlet 接口,开发人员可以通过继承该接口来创建自己的 Servlet。Servlet 是在服务器上运行的 Java 类,用于处理客户端的请求,并生成响应。 javax.servlet-api 3.0.1 还定义了一些与会话管理、过滤器、监听器和错误处理等相关的类和接口。它使开发人员能够更方便地处理与 Web 应用程序相关的功能,如用户身份验证、页面重定向和会话跟踪等。 通过使用 javax.servlet-api 3.0.1,开发人员可以创建灵活、可扩展和安全的 Web 应用程序。它提供了可重用的组件,可以处理各种请求和响应,并能够与不同的服务器和容器进行集成。此外,它还提供了一些工具类和接口,用于管理 Web 应用程序的配置和部署。 总结来说,javax.servlet-api 3.0.1 是用于开发基于 Java 的 Web 应用程序的一个组件。它提供了处理 HTTP 请求和响应的类和接口,以及与会话管理、过滤器、监听器和错误处理等相关的功能。通过使用 javax.servlet-api 3.0.1,开发人员可以创建高效、可扩展和安全的 Web 应用程序。 ### 回答3: javax.servlet-api是用于Java Servlet规范的官方API。它提供了开发基于Java的Web应用程序所需的所有必要功能和接口。javax.servlet-api 3.0.1是javax.servlet-api的一个特定版本,它是该API的第3个大版本中的一个小更新。 javax.servlet-api 3.0.1包含了一系列的类和接口,用于处理HTTP请求和响应,以及管理会话、过滤器和监听器等Web应用程序开发的关键组件。 例如,它提供了HttpServletRequest和HttpServletResponse接口,以便开发人员能够读取和处理客户端发送的HTTP请求,并生成对客户端的HTTP响应。此外,它还提供了ServletContext接口,用于在应用程序级别共享数据和资源。 javax.servlet-api 3.0.1还引入了一些新特性,如Servlet 3.0的异步支持,允许开发人员在处理请求和生成响应时进行异步操作。这使得在处理大量请求时能够提供更好的性能和可伸缩性。 总之,javax.servlet-api 3.0.1是一个重要的Java Web开发工具,为开发人员提供了处理HTTP请求和响应、管理会话等关键功能的API。它是遵循Java Servlet规范的一部分,并且在Web应用程序开发中被广泛使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值