设置一个仅Http曲奇饼的javax.servlet 2.5(Setting an httponly

2019-07-03 11:32发布

这里是设置一个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);
}

我相信,在servlet的3.0,还有一个办法直接做到这一点。 不幸的是我的组织使用2.5升级在这个时候是不是一种选择。

有没有办法使用响应设置Cookie? 这里有一个例子,我在网上找到

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

如果这就是做我想做的唯一途径,我会用,这样我就不会丢失任何数据,我的功能目前存储在cookie的替换一下“[一些东西]”?

Answer 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));


Answer 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);
}


Answer 3:

如果你不想使用:

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

那么您可以在Servlet 2.5的使用下面的代码。 它会在Chrome,FirefoxIE11工作完美。

Cookie cookie = new Cookie(cookieName, cookieValue);

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

response.addCookie(cookie);

:如你所知,我们没有setHttpOnly()servlet的2.5版本的方法,所以不是这个,你可以使用:

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

它会创建一个路径的饼干“/”,使饼干作为仅Http



Answer 4:

对于之前的JEE 6 Java企业版的版本,说的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());
    }


Answer 5:

对于Servlet API的2.5,你可以使用

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

要小心使用response.setHeader(),因为它会删除所有其他的饼干,例如,JSESSIONID的cookie。



Answer 6:

如果你不想硬编码HttpOnly; 或者不喜欢添加标题,使用阿帕奇四郎这样的:

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


Answer 7:

春季做到这一点使用反射没有打破的servlet容器2.5。

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

然而setHttpOnly方法仅对以后的Servlet仅3.0中提供。



Answer 8:

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

其实在我的情况下,这个代码不完全工作。
Path值不是"/"

但是,添加此cookie.setComment("; HttpOnly;"); 工作良好!



文章来源: Setting an httponly cookie with javax.servlet 2.5