Cookie設定HttpOnly屬性
在Servlet 3.0中增加對Cookie(請注意,這裡所說的Cookie,僅指和Session互動的Cookie,即人們常說的會話Cookie)較為全面的操作API。最為突出特性:支援直接修改Session ID的名稱(預設為“JSESSIONID”),支援對cookie設定HttpOnly屬性以增強安全,避免一定程度的跨站攻擊。防止指令碼攻擊,禁止了通過指令碼獲取cookie資訊,瀏覽器不會將其傳送給任何第三方
利用攔截器實現,判斷每次請求的響應是否包含SET-COOKIE頭部,重寫會話Cookie,新增需要的屬性。雖較為生硬,但靈活性強。
新的規範API
新的規範新增SessionCookieConfig介面,用於操作會話Cookie,需要掌握以下主要方法:
setName(String name) 修改Session ID的名稱,預設為"JSESSIONID"setDomain(String domain) 設定當前Cookie所處於的域 setPath(String path) 設定當前Cookie所處於的相對路徑 setHttpOnly(boolean httpOnly) 設定是否支援HttpOnly屬性 setSecure(boolean secure)
若使用HTTPS安全連線,則需要設定其屬性為truesetMaxAge(int maxAge)設定存活時間,單位為秒如何使用呢,很方便,在ServletContextListener監聽器初始化方法中進行設定即可;下面例項演示如何修改"JSESSIONID",以及新增支援HttpOnly支援:
全域性設定Session-Cookie相互動部分屬性@WebListenerpublic class SessionCookieInitialization implements ServletContextListener {private static final Log log = LogFactory .getLog(SessionCookieInitialization.class);public void contextInitialized(ServletContextEvent sce) { log.info("now init the Session Cookie"); ServletContext servletContext = sce.getServletContext(); SessionCookieConfig sessionCookie = servletContext .getSessionCookieConfig(); sessionCookie.setName("YONGBOYID"); sessionCookie.setPath(servletContext.getContextPath()); sessionCookie.setHttpOnly(true); sessionCookie.setSecure(false); log.info("name : " + sessionCookie.getName() + "\n" + "domain:" + sessionCookie.getDomain() + "\npath:" + sessionCookie.getPath() + "\nage:" + sessionCookie.getMaxAge()); log.info("isHttpOnly : " + sessionCookie.isHttpOnly()); log.info("isSecure : " + sessionCookie.isSecure()); }public void contextDestroyed(ServletContextEvent sce) { log.info("the context is destroyed !"); }
}需要通過ServletContext物件獲得SessionCookieConfig物件,才能夠進一步自定義session cookie的屬性。
無論以前的硬編碼還是新的API實現,目標都是一致的,所產生頭部資訊也是完全一致。
毫無疑問,後者更為方便快捷,省缺了顯示的操作響應後設資料。
對當前站點的第一次請求,很容易從響應頭資訊中看到Set-Cookie的屬性值:
不同瀏覽器平臺上測試
在Safari、IE8、Opera 11 一切都很正常
Firefox 3.6、Chrome 9.0,JSESSIONID會繼續存在:
YONGBOYID=601A6C82D535343163B175A4FD5376EA; JSESSIONID=AA78738AB1EAD1F9C649F705E
在所有瀏覽器中,SESSION ID等於新設定的YONGBOYID值(若不相等,問題就嚴重了!)
在客戶端JS無法獲得正確的SESSIONI ID了。
Tomcat伺服器內建支援
可以不用如上顯示設定Cookie domain、name、HttpOnly支援,在conf/context.xml檔案中配置即可:
<Context useHttpOnly="true", sessionCookieName="YONGBOYID", sessionCookieDomain="/servlet3" … >...</Context>
既然JAVA應用伺服器本身支援會話Cookie設定,那就沒有必要在程式程式碼中再次進行編碼了。這是一個好的實踐:不要重複造輪子。
這裡給出一段測試Session重寫的一段指令碼:
<div style="margin: 40px; paddding: 10px"><div><a href="sessionCookieTest">正常連線</a></div><div><a href="<%=response.encodeURL("sessionCookieTest") %>">重定向連線</a></div></div>
會被重寫的URL地址類似於:
http://localhost/servlet3/sessionCookieTest;YONGBOYID=19B94935D50245270060E49C9E69F5B6嗯,在取消會話Cookie之後,可以直接看到修改後的SESSION ID名稱了,當然這時候HttpOnly屬性也沒有多大意義了。
有一點別忘記,設定HttpOnly之後,客戶端的JS將無法獲取的到會話ID了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69960170/viewspace-2674309/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Cookie HttpOnly 屬性CookieHTTP
- 什麼是 cookie 的 httponly 屬性CookieHTTP
- cookie Secure與HttpOnlyCookieHTTP
- HTTPS會話裡的敏感Cookie沒有設定Secure屬性HTTP會話Cookie
- Cookie expires 屬性Cookie
- Cookie SameSite 屬性Cookie
- Cookie Secure 屬性Cookie
- Cookie path 屬性Cookie
- Cookie domain 屬性CookieAI
- 表屬性設定
- Cookie 的 SameSite 屬性Cookie
- jQuery設定disabled屬性與移除disabled屬性jQuery
- AppTheme屬性設定集合APP
- Cookie max-age 屬性Cookie
- Xcode設定自己的個性屬性XCode
- 行內元素屬性設定
- Echarts中Option屬性設定Echarts
- 執行緒屬性設定執行緒
- [譯] 理解 Cookie 的 SameSite 屬性Cookie
- C#反射設定屬性值和獲取屬性值C#反射
- Python的tkinter獲取元件屬性和設定元件屬性Python元件
- CSS中常用的屬性設定CSS
- jQuery - 設定內容和屬性jQuery
- cookie的設定Cookie
- 如何設定CookieCookie
- Python 訪問和設定私有屬性Python
- cocos 無法設定Node layer屬性
- python中__setattr__的屬性設定Python
- 如何設定cookie和刪除cookieCookie
- python flask 設定cookiePythonFlaskCookie
- postman如何設定cookiePostmanCookie
- CSS 與 canvas 屬性設定畫布尺寸CSSCanvas
- CSS與canvas屬性設定畫布尺寸CSSCanvas
- android -- EditText 設定 imeOptions 屬性為何失效?Android
- QT QLable屬性設定(尺寸,邊框等)QT
- 設定和獲取元素固有屬性值
- android — EditText 設定 imeOptions 屬性為何失效?Android
- A Better Finder Attributes 日期屬性設定淺析