23

これは、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 を使用しており、現時点でのアップグレードはオプションではありません。

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

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

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

4

9 に答える 9

9

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

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));
于 2014-03-21T02:51:56.753 に答える
4

JEE 6 より前のバージョンの Java Enterprise Edition、たとえば 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());
    }
于 2015-05-27T16:42:39.173 に答える
4

このコードは、を使用せずに機能し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);
}
于 2014-08-05T14:26:24.353 に答える
3

サーブレット API 2.5 の場合は、次を使用できます。

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

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

于 2016-01-18T16:24:34.673 に答える
1

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 以降でのみ使用できます。

于 2016-06-03T09:57:38.933 に答える