web-dev-qa-db-ja.com

javax.servlet 2.5でhttponly cookieを設定する

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とアップグレードを使用していますISオプションではありません。

応答を使用してCookieを設定する方法はありますか?これは私がオンラインで見つけた例です

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

これが私がやりたいことを行う唯一の方法である場合、関数が現在Cookieに保存しているデータを失わないように、「[SOME STUFF]」を何に置き換えますか?

20
aamiri

あなたが正しい、ヘッダーを手動で設定することはあなたの目標を達成するための正しい方法です。

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));
9
Val

このコードは、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

使用したくない場合:

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

次に、以下のコードをservlet 2.5で使用できます。 chromefirefoxおよびIE11で完全に機能します。

_Cookie cookie = new Cookie(cookieName, cookieValue);

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

response.addCookie(cookie);
_

:ご存知のようにservlet 2.5バージョンにはsetHttpOnly()メソッドがないため、これの代わりに以下を使用できます。

_setPath(";Path=/;HttpOnly;");
_

パス "/"でCookieを作成し、CookieHttpOnlyにします

4
shrikant

Java JEE 6より前のEnterprise Editionバージョン、たとえばサーブレット2.5の場合、OWASPで here から回避策を見つけることができます。以下に例を示します。

    /**
     * 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

サーブレットAPI 2.5の場合は、

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

JSESSIONID Cookieなどの他のすべてのCookieが削除されるため、response.setHeader()の使用には注意してください。

3
dpinya

ハードコーディングしたくない場合は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);
}
1
Ean V

Springは、サーブレット2.5コンテナを壊すことなくリフレクションを使用してこれを行います。

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

ただし、setHttpOnlyメソッドはServlet 3.0以降でのみ使用できます。

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

実際、私の場合、このコードは正確に機能しません。
パス値は_"/"_ではありません

ただし、これを追加するとcookie.setComment("; HttpOnly;");が正常に機能します。

0
sayingu