使用 URL 重写跟踪会话

在某些情况下,若是不能使用Cookie跟踪记录用户会话的话,就必须使用URL重写来跟踪会话。使用 URL 重写跟踪会话的应用程序必须遵循某些编程准则。应用程序开发者需要:

  • 对会话小服务程序进行编程以编码 URL
  • 提供小服务程序或 JSP 文件作为应用程序的入口点
  • 避免在应用程序中使用普通 HTML 文件
对会话小服务程序进行编程以编码 URL

根据小服务程序是将 URL 返回到浏览器,还是将它们重定向,在小服务程序代码中包括 encodeURL( ) 或 encodeRedirectURL( )。这里是您当前放在小服务程序代码中的示例演示。

重写 URL 以返回浏览器

假设您当前有语句:

out.println("catalog");

在将 URL 发送到输出流之前,更改小服务程序以调用 encodeURL 方法。

out.println("
重写 URL 以重定向

假设您当前有下列语句:

response.sendRedirect ("http://myhost/store/catalog");

在将 URL 发送到输出流之前,更改小服务程序以调用 encodeRedirectURL 方法。

response.sendRedirect (response.encodeRedirectURL ("http://myhost/store/catalog"));

encodeURL() 和 encodeRedirectURL() 方法是 HttpServletResponse 对象的一部分。这些调用在对 URL 进行编码之前将检查是否配置了 URL 重写。如果未配置,则返回原始的 URL。

如果启用了 cookie 和 URL 重写,而且调用了 response.encodeURL() 或 encodeRedirectURL(),即使做 HTTP 请求的浏览器处理了会话 cookie,也将编码该 URL。

您也可以配置会话支持来启用协议开关重写。当启用了此选项,该产品将使用会话标识来编码 URL,以在 HTTP 和 HTTPS 协议间转接。要获得详细信息,请参阅相关信息。

提供小服务程序或 JSP 文件作为入口点

应用程序的入口点(如初始屏幕所显示的)可能不需要使用会话。然而,如果应用程序在会话创建后通常需要会话支持(这意味着它的某些部分(如小服务程序)需要会话支持),则所有的 URL 必须是已编码的以使需要该会话支持的小服务程序(或其它应用程序组件)永久保留该会话标识。

下例显示了如何在 JSP 文件中嵌入 Java 代码:

<%
response.encodeURL ("/store/catalog"); 
%>
避免在应用程序中使用普通 HTML 文件

注,使用 URL 重写来维护会话状态,请勿从普通 HTML 文件(带有 .html 或 .htm 扩展名的文件)链接到您部分的应用程序。

因为普通 HTML 文件中无法使用 URL 编码,所以这种限制是必需的。为了使用 URL 重写来维持状态,用户在该会话期间所请求的每个页面都必须具有 Java 解释器所能理解的代码。

如果会话期间用户可能访问的应用程序(或 Web 应用程序)或部分站点中含有这种普通 HTML 文件,则请将它们转换成 JSP 文件。

这将影响到应用程序编写者,因为如上述描述,用 URL 重写维护会话要求应用程序中的每个小服务程序必须对

标记上的每个 HREF 属性使用 URL 编码。

如果应用程序中的一个或多个小服务程序不调用 encodeURL(String url) 或 encodeRedirectURL(String url) 方法,将丢失会话。

附:javax.servlet.http.HttpServletResponse的两个方法

encodeRedirectURL

public String encodeRedirectURL(String url);

  对sendRedirect方法使用的指定URL进行编码。如果不需要编码,就直接返回这个URL。之所以提供这个附加的编码方法,是因为在redirect的情况下,决定是否对URL进行编码的规则和一般情况有所不同。所给的URL必须是一个绝对URL。相对URL不能被接收,会抛出一个IllegalArgumentException。

  所有提供给sendRedirect方法的URL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。

encodeURL

public String encodeURL(String url);

  对包含session ID的URL进行编码。如果不需要编码,就直接返回这个URL。Servlet引擎必须提供URL编码方法,因为在有些情况下,我们将不得不重写URL,例如,在响应对应的请求中包含一个有效的session,但是这个session不能被非URL的(例如cookie)的手段来维持。

  所有提供给Servlet的URL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值