問題與解決
初學servlet,一直沒在意HttpServletResponse
的encodeURL
方法,所以服務器端返回地址的時候一直這麼寫的
"<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
後的路徑嗎?