0

我们使用 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。是否真的需要(即使我没有提供任何参数)?

4

1 回答 1

0

关于最后一个问题,Spring 3.0.5 的经验告诉您可以省略 form:form 中的 action 属性,它将使用当前 URL 并附加会话 ID 参数以防不使用 cookie。

与此相关,是否可以使用更短的语法,例如 <form:form action="<c:url value="foo"/>" ... ?这种确切的语法不起作用,因为标签不能以这种方式嵌套。额外变量的使用对我来说有点太长了。

于 2013-06-14T15:11:05.020 回答