web-dev-qa-db-fra.com

Définir un cookie httponly avec javax.servlet 2.5

voici une fonction qui définit un 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);
}

Je crois en Servlet 3.0, il existe un moyen de le faire directement. Malheureusement, mon organisation utilise la version 2.5 et UPGRADING à ce stade IS n'est pas une option.

est-il possible d'utiliser la réponse pour définir le cookie? Voici un exemple que j'ai trouvé en ligne 

response.setHeader("SET-COOKIE", "[SOME STUFF]" +"; HttpOnly")

Si c'est la seule façon de faire ce que je veux, qu'est-ce que je remplacerais par "[QUELQUES STUFF]" pour que je ne perde aucune des données que ma fonction stocke actuellement dans le cookie?

19
aamiri

Vous avez raison, la définition manuelle de l'en-tête est la bonne façon d'atteindre votre objectif.

Vous pouvez également utiliser javax.ws.rs.core.NewCookie ou toute autre classe avec la méthode toString utile pour imprimer un cookie dans un en-tête afin de simplifier les choses.

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";
}

Et l'usage:

response.setHeader("SET-COOKIE", getHttpOnlyCookieHeader(myOriginalCookie));
9
Val

Ce code fonctionne sans utiliser 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);
}
4
user3910752

Si vous ne voulez pas utiliser:

response.addHeader("Set-Cookie","name=value; HttpOnly");

alors vous pouvez utiliser le code ci-dessous dans servlet 2.5 . Cela fonctionnera parfaitement dans chrome , firefox et IE11

Cookie cookie = new Cookie(cookieName, cookieValue);

cookie.setPath(";Path=/;HttpOnly;");
cookie.setSecure(isSecureCookie);
cookie.setMaxAge(maxAge);

response.addCookie(cookie);

Note : Comme vous savez que nous n'avons pas de méthode setHttpOnly() dans servlet 2.5 version, vous pouvez donc utiliser:

setPath(";Path=/;HttpOnly;");

il créera un cookie avec le chemin "/" et fera le Cookie as HttpOnly

4
shrikant

Pour les versions de Java Enterprise Edition antérieures à JEE 6, dites Servlet 2.5, vous pouvez trouver une solution de contournement depuis ici chez OWASP. En voici un exemple:

    /**
     * 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());
    }
3
Yuci

Pour Servlet API 2.5, vous pouvez utiliser

response.addHeader("Set-Cookie","name=value; HttpOnly");

Faites attention avec response.setHeader (), car il supprime tous les autres cookies, par exemple le cookie JSESSIONID.

3
dpinya

Si vous ne voulez pas coder en dur HttpOnly; ou si vous ne voulez pas ajouter d'en-tête, utilisez Apache shiro comme ceci:

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);
}
1
Ean V

Spring effectue cela en utilisant la réflexion sans se briser sur les conteneurs Servlet 2.5.

Method setHttpOnlyMethod = ReflectionUtils.findMethod(Cookie.class, "setHttpOnly", boolean.class);
if (setHttpOnlyMethod != null) {
    ReflectionUtils.invokeMethod(setHttpOnlyMethod, cookie, Boolean.TRUE);      
}

Cependant, la méthode setHttpOnly est uniquement disponible à partir de Servlet 3.0. 

0
Fahim Farook
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath("/");
cookie.setMaxAge(-1);
response.addCookie(cookie);

En fait, dans mon cas, ce code ne fonctionne pas exactement.
La valeur du chemin n'est pas "/"

Mais ajouter ceci cookie.setComment("; HttpOnly;"); fonctionne bien!

0
sayingu