我们使用 URL 重写或 cookie 来维持 Web 服务器和浏览器之间的会话,因为它们使用本质上是无状态的 HTTP 协议进行通信。由于其无状态的性质,服务器永远不会识别任何客户端(浏览器),无论它之前是否发出过任何请求。因此,我们需要在它们之间维护一个唯一标识符。
当浏览器(客户端)不支持 cookie 或在浏览器上禁用 cookie 时,将使用称为URL 重写的技术,并且sessionID
需要在 URL 中进行编码,例如,
try
{
response.sendRedirect(response.encodeRedirectURL("index.jsp?param=value"));
}
catch(Exception e)
{
}
重新分级 JSP 中的普通链接,我使用 JSTL 的<c:url>
标记,例如,
<c:url value="Category.htm" var="url">
<c:param name="id" value="${row.category.catId}"/>
</c:url>
<a href="${url}"
name="catId${row.category.catId}"
title="Click to view the details.">${row.category.catName}
</a>
它嵌入在一个<c:forEach>
循环中。
但是,如果浏览器支持 cookie 或会话跟踪被关闭,则 URL 编码是不必要的并且不会发生。
那么,在这种情况下,如果 URI 或查询包含特殊字符(如+
, &
, )@
怎么办?
它们需要编码,如果 URI 和查询字符串分别编码,会URL rewriting
自动完成,以防 cookie 被禁用或不被浏览器支持?
URI uri = new URI(
"http",
null,
request.getServerName(),
request.getServerPort(), "/WebApp/index.jsp",
"param="+URLEncoder.encode("some value@+", "UTF-8"), null);
String uriString = uri.toASCIIString();
在这种情况下,参数param
需要在检索时进行解码,
out.println(URLDecoder.decode(request.getParameter("param"), "UTF-8")");
这种情况下的 URL 重写呢,我不确定是 Servlet Container 完成还是我们自己单独处理。
另外一件事,在使用RequestDispatcher
,<jsp:forward page="index.jsp"/>
和<jsp:include page="template.jsp"/>
时,是否有必要像处理 URL 编码一样?
try
{
RequestDispatcher requestDispatcher=
request.getRequestDispatcher(response.encodeURL("index.jsp?param=value"));
requestDispatcher.forward(request, response);
}
catch(Exception e)
{
}
我总是使用<c:url>
表单的 action 属性,比如(关于 Spring),
<c:url value="${param.url}" var="url">
<c:param name="id" value="${param.id}"/>
</c:url>
<form:form action="${url}" id="dataForm" name="dataForm" method="post" commandName="someBean">
.
.
.
</form:form>
它指的是当前的 URL。是否真的需要(即使我没有提供任何参数)?