首页 文章

URL的编码和重写

提问于
浏览
0

我们使用URL重写或cookie来维护Web服务器和浏览器之间的会话,因为它们使用HTTP协议进行通信,而HTTP协议本质上是无状态的 . 由于其无状态特性,服务器永远不会识别任何客户端(浏览器)是否先前发出过任何请求 . 因此,我们需要在它们之间保持唯一的标识符 .

当浏览器(客户端)不支持在浏览器上禁用cookie或cookie时,使用称为URL重写的技术,并且需要在URL中编码 sessionID ,例如,

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和查询字符串分别编码,如果cookie被禁用或浏览器不支持,会自动完成吗?1515157_?

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容器完成还是由我们自己单独处理 .


另外一件事,在使用 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> 与表单的动作属性(如关于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 . 是否真的需要(即使我没有提供任何参数)?

1 回答

  • 0

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

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

相关问题