我們使用URL重寫或cookie來維護跨Web服務器和瀏覽器的會話,因爲它們使用本質上無狀態的HTTP協議進行通信。由於其無狀態性質,服務器從不識別任何客戶端(瀏覽器)是否曾經提出任何請求。因此我們需要在它們之間保持唯一的標識符。URL的編碼和重寫
當瀏覽器(客戶機)不支持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>
循環中。
但是,如果瀏覽器支持cookies或會話跟蹤關閉,則URL編碼是不必要的,並且不會發生。
所以,在這種情況下,如果一個URI或查詢包含什麼特殊字符,如+
,&
,@
?
他們需要編碼,如果一個URI和一個查詢字符串分開編碼,將自動完成URL rewriting
,如果cookie被禁用或不支持瀏覽器像?
URI uri = new URI(
"http",
null,
request.getServerName(),
request.getServerPort(), "/WebApp/index.jsp",
"param="+URLEncoder.encode("some [email protected]+", "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屬性,
<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。是否真的需要(即使我沒有提供任何參數)?
它難以理解什麼是問題?你可以先解決你的問題,然後在你的文章中提供詳細信息 – Pranalee