Установка httponly cookie с помощью javax.servlet 2.5
вот функция, которая устанавливает cookie:
public void addCookie(String cookieName, String cookieValue, Integer maxAge, HttpServletResponse response) {
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setPath("/mycampaigns");
cookie.setSecure(isSecureCookie);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
Я верю в сервлет 3.0, есть способ сделать это напрямую. К сожалению, моя организация использует 2.5 и UPGRADING на этом этапе НЕ НЕ ОПЦИЯ.
Есть ли способ использовать ответ для установки cookie? Вот пример, который я нашел в Интернете
response.setHeader("SET-COOKIE", "[SOME STUFF]" +"; HttpOnly")
Если это единственный способ сделать то, что я хочу, что бы заменить "[SOME STUFF]" так, чтобы я не потерял ни одной из данных, которые моя функция в настоящее время хранит в файле cookie?
Ответы
Ответ 1
Вы правы, ручной настройкой заголовка является правильным способом достижения вашей цели.
Вы также можете использовать javax.ws.rs.core.NewCookie или любой другой класс с полезным методом toString для печати cookie в заголовке, чтобы сделать вещи более простыми.
public static String getHttpOnlyCookieHeader(Cookie cookie) {
NewCookie newCookie = new NewCookie(cookie.getName(), cookie.getValue(),
cookie.getPath(), cookie.getDomain(), cookie.getVersion(),
cookie.getComment(), cookie.getMaxAge(), cookie.getSecure());
return newCookie + "; HttpOnly";
}
И использование:
response.setHeader("SET-COOKIE", getHttpOnlyCookieHeader(myOriginalCookie));
Ответ 2
Этот код работает без использования response.setHeader()
:
public void addCookie(String cookieName, String cookieValue, Integer maxAge, HttpServletResponse response) {
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setPath("; HttpOnly;");
cookie.setSecure(isSecureCookie);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
Ответ 3
Для версий Java Enterprise Edition до JEE 6, скажем, Servlet 2.5, вы можете найти обходное решение из здесь в OWASP. Ниже приведен пример:
/**
* Issue a cookie to the browser
*
* @param response
* @param cookieName
* @param cookieValue
* @param cookiePath
* @param maxAgeInSeconds
*/
public static void issueCookieHttpOnly(HttpServletResponse response,
String cookieName,
String cookieValue,
String cookiePath,
long maxAgeInSeconds) {
Date expireDate= new Date();
expireDate.setTime (expireDate.getTime() + (1000 * maxAgeInSeconds));
// The following pattern does not work for IE.
// DateFormat df = new SimpleDateFormat("dd MMM yyyy kk:mm:ss z");
// This pattern works for Firefox, Chrome, Safari and Opera, as well as IE.
DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy kk:mm:ss z");
df.setTimeZone(TimeZone.getTimeZone("GMT"));
String cookieExpire = df.format(expireDate);
StringBuilder sb = new StringBuilder(cookieName);
sb.append("=");
sb.append(cookieValue);
sb.append(";expires=");
sb.append(cookieExpire);
sb.append(";path=");
sb.append(cookiePath);
sb.append(";HttpOnly");
response.setHeader("SET-COOKIE", sb.toString());
}
Ответ 4
Для Servlet API 2.5 вы можете использовать
response.addHeader("Set-Cookie","name=value; HttpOnly");
Будьте осторожны с использованием response.setHeader(), поскольку он удаляет все другие файлы cookie, например, cookie JSESSIONID.
Ответ 5
Если вы не хотите использовать:
response.addHeader("Set-Cookie","name=value; HttpOnly");
то вы можете использовать приведенный ниже код в сервлет 2.5. Он будет работать идеально в хром, firefox и IE11.
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setPath(";Path=/;HttpOnly;");
cookie.setSecure(isSecureCookie);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
Примечание. Как вы знаете, у нас нет метода setHttpOnly()
в версии сервлета 2.5, поэтому вместо этого вы можете использовать:
setPath(";Path=/;HttpOnly;");
он создаст файл cookie с контуром "/" и сделает Cookie как HttpOnly
Ответ 6
Spring делает это с использованием отражения без взлома контейнеров 2.5.
Method setHttpOnlyMethod = ReflectionUtils.findMethod(Cookie.class, "setHttpOnly", boolean.class);
if (setHttpOnlyMethod != null) {
ReflectionUtils.invokeMethod(setHttpOnlyMethod, cookie, Boolean.TRUE);
}
Однако метод setHttpOnly доступен только для сервлета 3.0.
Ответ 7
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath("/");
cookie.setMaxAge(-1);
response.addCookie(cookie);
Собственно, в моем случае этот код не работает точно.
Значение пути не "/"
Но добавьте этот cookie.setComment("; HttpOnly;");
отлично!
Ответ 8
Если вы не хотите использовать hardcode HttpOnly;
или не хотите добавлять заголовок, используйте apache shiro следующим образом:
void addCookie(javax.servlet.http.Cookie httpCookie,
HttpServletRequest request,
HttpServletResponse response) {
org.apache.shiro.web.servlet.Cookie cookie =
new org.apache.shiro.web.servlet.SimpleCookie(httpCookie.getName());
cookie.setValue(httpCookie.getValue());
cookie.setPath(httpCookie.getPath());
// set other stuff from the original httpCookie
cookie.setHttpOnly(true);
cookie.saveTo(request, response);
}