servlet response的encodeURL

問題與解決

初學servlet,一直沒在意HttpServletResponseencodeURL方法,所以服務器端返回地址的時候一直這麼寫的

 "<form action=\"" +  
req.getContextPath() 
 + "/\" method=\"post\">\n"    

直到運行的時候才發現,這裏的請求沒有發送到服務器端到相應servlet的doPost方法,但是瀏覽器檢查發現,表單的提交地址確實是對的啊。但是每次點擊登錄,頁面不變,只是刷新了以下登錄頁面。(這裏我 登錄的get方法是返回靜態頁面,post方法是表單提交登錄)。

最後突然想起來課上提過一句encodeURL方法,改了以下

 "<form action=\"" +  
resp.encodeURL(req.getContextPath()) 
 + "/\" method=\"post\">\n"    

再試一下,一切正常。

網上搜索後,發現。原來encodeURL方法主要作用是跟蹤session,

Java Servlet API 中提出了跟蹤 Session 的另一種機制,如果客戶端瀏覽器不支持 Cookie,Servlet 容器可以重寫客戶請求的 URL,把 Session ID 添加到 URL 信息中。

HttpServletResponse 接口提供了重寫 URL 的方法:public String encodeURL(java.lang.String url)
該方法的實現機制爲

  • 先判斷當前的 Web 組件是否啓用 Session,如果沒有啓用 Session,直接返回參數 url。
  • 再判斷客戶端瀏覽器是否支持 Cookie,如果支持 Cookie,直接返回參數 url;如果不支持 Cookie,就在參數 url 中加入 Session ID 信息,然後返回修改後的 url。

也就是說爲了實現即使在客戶端不支持cookie的情況下(我們都知道session機制的實現需要一般依靠cookie),也能夠在通過在url後拼接sessionid的形式跟蹤id。所以在用了encodeURL後,支持跟蹤session,我寫的登錄自然也能成功了。

仍有的疑惑

還是上面的例子。我寫成這樣,仍然可以正常運行:

 "<form action=\"/login/\" method=\"post\">\n"    

我將地址硬編碼到html中,仍然可以正常運行,這是爲什麼?默認就是encodeURL後的路徑嗎?

發佈了32 篇原創文章 · 獲贊 60 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章