Cookie
Cookie是servlet發送到web浏覽器的少量資訊,這些資訊由浏覽器儲存,然後發送回伺服器,
cookie一般用來儲存session的id的會話。
一個Cookie擁有一個名稱、一個值和一些可選屬性,比如注釋、路徑和域限定符、最大生存時間和版本号
Servlet通過使用HttpServletResponse的addCookie(cookie)方法将 Cookie發送到浏覽器,該方法将字段添加到HTTP響應頭發送到浏覽器。浏覽器支援每台Web伺服器有20個Cookie,總共有300個Cookie,每個Cookie的大小預設為4KB
浏覽器通過向HTTP請求頭添加字段将Cookie傳回給Servlet。可使用HttpServletRequest的getCookies()方法從請求中擷取Cookie
Cookie通過名稱和路徑來進行區分
Cookie的常用方法
1.Cookie(String name, String value) 建構通過key/value儲存的資訊
例子:
2.void setMaxAge(int time)設定Cookie的最大生存時間,以秒為機關。負值浏覽器退出時删除。0值會導緻删除cookie
3.int getMaxAge() 傳回以秒為機關指定的Cookie最大生存時間(預設生存時間為-1)
4.String getName() 傳回Cookie名稱,名稱在建立之後不能更改
5.String getValue() 傳回cookie值
6.void setPath(String uri) 指定用戶端應該傳回cookie的路徑,對于指定目錄中的所有頁面及該目錄子目錄中的所有頁面都是可見的
7.void setDomain(String pattern) 指定應在其中顯示此Cookie的域
8.String getDomain() 傳回為此Cookie設定的域名
(設定 cookie 不能設定中文)
重寫URL
為什麼要對URL重寫
–用戶端不支援Cookie或禁用Cookie
–伺服器端不能通過Cookie擷取jsessionid
URL重寫
–将jsessionid加入到URL之後
–使用HttpServletResponse迚行重寫
• String encodeURL(String url) 通過将會話ID包含在指定URL中并對該 URL進行編碼。如果
不需要編碼,則傳回未更改的URL
• String encodeRedirectURL(String url) 對指定URL進行編碼,以便在 sendRedirect方法中使
用它,如果不需要編碼,則傳回未更改的URL(可判斷是否需要将ID加入URL)
防止表單重複送出
思路:
在服務端生成一個唯一的随機辨別号,專業術語稱為Token(令牌),同時在目前使用者的session域中儲存這個Token。然後将Token發送到用戶端的form表單中,在form表單中使用隐藏域來存儲這個Token,表單送出的時候連同這個Token一起送出到服務端,然後在服務端判斷用戶端送出上來的Token與服務端生成的Token是否一緻,如果不一緻,那就是重複送出了,此時服務端就可以不處理重複送出的表單了。如果相同則處理表單送出,處理完後清理目前使用者的session域中存儲的辨別号
重複送出的幾種情況?
①在表單送出到一個servlet,而servlet又通過請求轉發的方式到jsp頁面,位址欄裡面還儲存着servlet的路徑,然後在響應頁面點選重新整理,這就是重複送出
②在響應頁面沒有到達時,重複點選送出按鈕
③點選傳回,直接點選送出
如何避免表單重複送出?
在表單做一個标記,送出到servlet,檢查标記是否存在,檢查标記和預定義的标記是否一緻,如果一緻,受理請求,銷毀标記,如果不一緻,或沒有标記,則直接響應頁面提示資訊,“重複送出”。
第一種方式:
提供一個隐藏域(pass), 原因:無法準确擷取請求的資訊
第二種方式:
放在request中(pass),原因:因為表單頁面重新整理後,目前request已經被銷毀了,再送出,已經是新的request了
第三種方式:
把标記放在session中:(pass)
- 把原表單頁面生成随機token
- 在原表單頁面,把token值放入session屬性
- 在原表單中,token值放到隐藏域
- 在目标servlet中,擷取session和隐藏域中的token的值,比較兩個值
若一緻,受理請求且把session的請求的值銷毀
若不一緻,提示表單已經送出過了