使用javax.servlet 2.5设置httponly cookie

使用javax.servlet 2.5设置httponly cookie,java,cookies,cookie-httponly,servlet-2.5,Java,Cookies,Cookie Httponly,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(isSecureC

下面是一个设置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);
}
我相信Servlet3.0,有一种方法可以直接做到这一点。不幸的是,我的组织使用的是2.5,在这个关头升级不是一个选项

有没有办法使用响应来设置cookie?这是我在网上找到的一个例子

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

如果这是我想做的唯一方法,我会用什么替换“[一些东西]”,这样我就不会丢失我的函数当前存储在cookie中的任何数据?

你是对的,手动设置标题是实现目标的正确方法

您还可以使用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));

此代码不使用
response.setHeader()


对于JEE6之前的Java企业版版本,比如Servlet2.5,您可以从OWASP找到一个解决方法。以下是一个例子:

/**
*向浏览器发出cookie
* 
*@param响应
*@param-cookieName
*@param-cookieValue
*@param-cookiePath
*@param maxAgeInSeconds
*/
公共静态无效issueCookieHttpOnly(HttpServletResponse,
字符串cookieName,
字符串值,
字符串路径,
长maxAgeInSeconds){
到期日期=新日期();
expireDate.setTime(expireDate.getTime()+(1000*maxAgeInSeconds));
//以下模式不适用于IE。
//DateFormat df=新的简化格式(“dd-MMM-yyy-kk:mm:ss-z”);
//这种模式适用于Firefox、Chrome、Safari和Opera以及IE。
DateFormat df=新的简化格式(“EEE,dd-MMM-yyyy-kk:mm:ss z”);
设置时区(TimeZone.getTimeZone(“GMT”);
字符串cookieExpire=df.format(expireDate);
StringBuilder sb=新的StringBuilder(cookieName);
某人加上(“=”);
某人附加(价值);
某人追加(“;expires=”);
某人追加(到期);
sb.append(“;path=”);
某人追加(cookiePath);
sb.附加(“仅限HttpOnly”);
setHeader(“SET-COOKIE”,sb.toString());
}

对于Servlet API 2.5,您可以使用

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

请小心使用response.setHeader(),因为它会删除所有其他cookie,例如JSSessionID cookie。

Spring使用反射来完成此操作,而不会破坏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以后的版本中可用

如果您不想使用:

response.addHeader("Set-Cookie","name=value; HttpOnly");
然后可以在Servlet2.5中使用以下代码。它将在chrome、firefox和IE11中完美运行

注意:正如您所知,servlet 2.5版本中没有
setHttpOnly()
方法,因此您可以使用:

setPath(";Path=/;HttpOnly;");
它将创建一个路径为“/”的cookie,并将cookie设置为HttpOnly

实际上,在我的例子中,这段代码并不完全有效。
路径值不是
“/”


但是添加这个
cookie.setComment(“;HttpOnly;”)工作正常

如果您不想硬编码
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);
}

我意识到这是一个老问题,但我提出了一个解决方案-查看我的答案,了解我何时需要使用path“/”和cookie。setPath(“/;HttpOnly;”)它生成带有path=“/;HttpOnly;”的cookie,Chrome错误地将路径计算为“/”值(注意引号).尽管我首先对这个答案投了赞成票,但最后还是得到了另一个答案,它使用了getHttpOnlyCookieHeader(…)helper方法。我在哪里设置这个类?或者如何配置它?谢谢@Val,但我仍然有疑问,我看到了这个类及其所有属性,但是,我如何在我的应用程序上启用它呢?有点晚了,但是因为2.0,javax.ws.rs.core.NewCookie有一个仅带有httpOnly的构造函数,你不需要将它附加到toString():NewCookie nc=new NewCookie(“名称、值、路径、域、注释、3600、真、真);这不是一个好主意:如果您可以使用反射在您的生产/开发环境中查找setHttpOnly方法,那么您应该首先修复您的项目依赖关系。这不是OP所要求的。在将servlet 2.5应用程序部署到servlet 3.0+容器时,这对我有效。尝试在注释中附加HttpOnly没有效果e注释被引用。我相信将其添加到路径中会得到相同的结果,但我没有尝试。我尝试了此操作,它只是将HttpOnly放在引用的注释中,浏览器会忽略它。
setPath(";Path=/;HttpOnly;");
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath("/");
cookie.setMaxAge(-1);
response.addCookie(cookie);
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);
}