这是一个设置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和UPGRADING不是一个选项。
有没有办法使用响应来设置cookie?这是我在网上找到的一个例子
response.setHeader("SET-COOKIE", "[SOME STUFF]" +"; HttpOnly")
如果这是我想要的唯一方法,那么我会用什么替换“[SOME STUFF]”,这样我就不会丢失我的函数当前存储在cookie中的任何数据?
答案 0 :(得分: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));
答案 1 :(得分: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);
}
答案 2 :(得分:4)
如果您不想使用:
response.addHeader("Set-Cookie","name=value; HttpOnly");
然后您可以在 servlet 2.5 中使用以下代码。它将在 chrome , firefox 和 IE11 中完美运行。
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setPath(";Path=/;HttpOnly;");
cookie.setSecure(isSecureCookie);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
注意:如您所知,我们在 servlet 2.5 版本中没有setHttpOnly()
方法,因此您可以使用以下方法:< / p>
setPath(";Path=/;HttpOnly;");
它将使用路径&#34; / &#34;创建一个cookie。并将 Cookie 设为 HttpOnly
答案 3 :(得分:3)
对于JEE 6之前的Java Enterprise Edition版本,比如Servlet 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());
}
答案 4 :(得分:3)
对于Servlet API 2.5,您可以使用
response.addHeader("Set-Cookie","name=value; HttpOnly");
小心使用response.setHeader(),因为它会删除所有其他cookie,例如JSESSIONID cookie。
答案 5 :(得分:1)
如果您不想硬编码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);
}
答案 6 :(得分:0)
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以上版本。
答案 7 :(得分:0)
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath("/");
cookie.setMaxAge(-1);
response.addCookie(cookie);
实际上在我的情况下,这段代码不能正常工作
路径值不是"/"
但是添加此cookie.setComment("; HttpOnly;");
可以正常工作!
答案 8 :(得分:0)
@Yuci 在响应头中添加 cookie 的例子在我的环境中有一些失败。主要是日期格式错误,如果您addHeader
,您不会像 setHeader
那样删除其他 cookie。所以这是我使用 Servlet API 2.5 设置 HttpOnly
和 Secure
cookie 的工作代码:
public static void addHttpOnlyCookie(HttpServletResponse response,
String cookieName,
String cookieValue,
String cookiePath,
long maxAgeInSeconds) {
Date expireDate = new Date();
expireDate.setTime(expireDate.getTime() + 1000L * maxAgeInSeconds);
DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z", Locale.ENGLISH);
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("; Secure; HttpOnly");
response.addHeader("SET-COOKIE", sb.toString());
}
请注意,这些 setPath
黑客绝对不起作用。不要这样做,它们不适用于 Safari:cookie.setPath(";HttpOnly;");
。 <= 错误