Подтвердить что ты не робот

Установка 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?

4b9b3361

Ответ 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);
}