2012-11-22 72 views
0

我們使用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。是否真的需要(即使我沒有提供任何參數)?

+0

它難以理解什麼是問題?你可以先解決你的問題,然後在你的文章中提供詳細信息 – Pranalee

回答

0

關於最後一個問題,Spring 3.0.5的經驗告訴你可以在form:form中省略action屬性,它會使用當前URL並在不使用cookies的情況下追加會話ID參數。

與此相關,是否可以使用更短的語法,如<窗體:form action =「< c:url value =」foo「/>」...? 這個確切的語法不起作用,因爲標籤不能以這種方式嵌套。額外變量的使用對我來說有點太長了。