繁体   English   中英

URL的编码和重写

[英]Encoding and rewriting of URL

我们使用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容器完成还是由我们自己处理。


还有一件事情,在使用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。 确实需要吗(即使我没有提供任何参数)?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM