這篇文章將為大家詳細(xì)講解有關(guān)Cookie中怎么設(shè)置HttpOnly屬性,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
利用攔截器實(shí)現(xiàn),判斷每次請(qǐng)求的響應(yīng)是否包含SET-COOKIE頭部,重寫會(huì)話Cookie,添加需要的屬性。雖較為生硬,但靈活性強(qiáng)。
新的規(guī)范API
新的規(guī)范添加SessionCookieConfig接口,用于操作會(huì)話Cookie,需要掌握以下主要方法:
setName(String name) 修改Session ID的名稱,默認(rèn)為"JSESSIONID"setDomain(String domain) 設(shè)置當(dāng)前Cookie所處于的域 setPath(String path) 設(shè)置當(dāng)前Cookie所處于的相對(duì)路徑 setHttpOnly(boolean httpOnly) 設(shè)置是否支持HttpOnly屬性 setSecure(boolean secure)
若使用HTTPS安全連接,則需要設(shè)置其屬性為truesetMaxAge(int maxAge)設(shè)置存活時(shí)間,單位為秒如何使用呢,很方便,在ServletContextListener監(jiān)聽器初始化方法中進(jìn)行設(shè)定即可;下面實(shí)例演示如何修改"JSESSIONID",以及添加支持HttpOnly支持:
全局設(shè)置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 !"); }
}需要通過(guò)ServletContext對(duì)象獲得SessionCookieConfig對(duì)象,才能夠進(jìn)一步自定義session cookie的屬性。
無(wú)論以前的硬編碼還是新的API實(shí)現(xiàn),目標(biāo)都是一致的,所產(chǎn)生頭部信息也是完全一致。
毫無(wú)疑問(wèn),后者更為方便快捷,省缺了顯示的操作響應(yīng)元數(shù)據(jù)。
對(duì)當(dāng)前站點(diǎn)的第一次請(qǐng)求,很容易從響應(yīng)頭信息中看到Set-Cookie的屬性值:
不同瀏覽器平臺(tái)上測(cè)試
在Safari、IE8、Opera 11 一切都很正常
Firefox 3.6、Chrome 9.0,JSESSIONID會(huì)繼續(xù)存在:
YONGBOYID=601A6C82D535343163B175A4FD5376EA; JSESSIONID=AA78738AB1EAD1F9C649F705E
在所有瀏覽器中,SESSION ID等于新設(shè)置的YONGBOYID值(若不相等,問(wèn)題就嚴(yán)重了?。?/p>
在客戶端JS無(wú)法獲得正確的SESSIONI ID了。
Tomcat服務(wù)器內(nèi)置支持
可以不用如上顯示設(shè)置Cookie domain、name、HttpOnly支持,在conf/context.xml文件中配置即可:
...
既然JAVA應(yīng)用服務(wù)器本身支持會(huì)話Cookie設(shè)定,那就沒有必要在程序代碼中再次進(jìn)行編碼了。這是一個(gè)好的實(shí)踐:不要重復(fù)造輪子。
這里給出一段測(cè)試Session重寫的一段腳本:
關(guān)于Cookie中怎么設(shè)置HttpOnly屬性就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。