最近在解決XSS注入的問題,由於使用的servlet版本是2.5,不支援httpOnly的屬性,故做了個工具類來實現cookie的httpOnly的功能。全類如下:
/**
* cookie工具類,解決servlet3.0以前不能添加httpOnly屬性的問題
*
* @author zhang-long
* @createTime 2013-6-20
*/
public class CookieUtil {
/**
*
* @param response HttpServletResponse類型的響應
* @param cookie 要設定httpOnly的cookie對象
*/
public static void addHttpOnlyCookie(HttpServletResponse response, Cookie cookie){
// 判斷對象是否存在null的情況
if(checkObjIsNull(response) || checkObjIsNull(cookie)){
return;
}
//依次取得cookie中的名稱、值、最大存留時間、路徑、域和是否為安全性通訊協定資訊
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
int maxAge = cookie.getMaxAge();
String path = cookie.getPath();
String domain = cookie.getDomain();
boolean isSecure = cookie.getSecure();
StringBuffer strBufferCookie = new StringBuffer();
strBufferCookie.append(cookieName + "=" + cookieValue + ";");
if(maxAge >= 0){
strBufferCookie.append("Max-Age=" + cookie.getMaxAge() + ";");
}
if(!checkObjIsNull(domain)){
strBufferCookie.append("domain=" + domain + ";");
}
if(!checkObjIsNull(path)){
strBufferCookie.append("path=" + path + ";");
}
if(isSecure){
strBufferCookie.append("secure;HTTPOnly;");
}else{
strBufferCookie.append("HTTPOnly;");
}
response.addHeader("Set-Cookie",strBufferCookie.toString());
}
private static boolean checkObjIsNull(Object obj){
if(obj == null){
return true;
}
return false;
}
}
使用舉例:
Cookie cookie1=new Cookie("n","cookieValue1");
cookie1.setMaxAge(500);
Cookie cookie2=new Cookie("cookieName2","cookieValue2");
Cookie cookie3=new Cookie("cookieName3","cookieValue3");
cookie3.setSecure(true);
Cookie cookie4=new Cookie("cookieName4","cookieValue4");
cookie4.setSecure(true);
CookieUtil.addHttpOnlyCookie(response, cookie1);
CookieUtil.addHttpOnlyCookie(response, cookie2);
CookieUtil.addHttpOnlyCookie(response, cookie3);
CookieUtil.addHttpOnlyCookie(response, cookie4);
例子中紅色的部分只有在應用 使用了HTTPS協議的時候才能添加,否則這個cookie將再也無法讀出!
添加成功後,查看cookie如下: