[英]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.