2012-10-30 36 views
17

đây là một chức năng mà bộ cookie:Thiết cookie HttpOnly với javax.servlet 2,5

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

Tôi tin vào servlet 3.0, có một cách để làm điều này trực tiếp. Thật không may, tổ chức của tôi sử dụng 2,5 và NÂNG CẤP tại thời điểm này KHÔNG PHẢI LÀ TÙY CHỌN.

có cách nào để sử dụng phản hồi để đặt cookie không? Dưới đây là ví dụ tôi tìm thấy trực tuyến

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

Nếu đây là cách duy nhất để làm những gì tôi muốn, tôi sẽ thay thế "[MỘT SỐ STUFF]" để tôi không mất bất kỳ dữ liệu nào mà chức năng của tôi hiện đang lưu trữ trong cookie?

+2

Tôi nhận ra đây là một câu hỏi cũ nhưng tôi đã đưa ra một giải pháp - xem tôi câu trả lời cho [Làm thế nào để bạn cấu hình các cookie HttpOnly trong tomcat/java webapps?] (http://stackoverflow.com/a/14610452/9822) –

Trả lời

9

Bạn nói đúng, đặt tiêu đề theo cách thủ công là cách phù hợp để đạt được mục tiêu của bạn.

Bạn cũng có thể sử dụng javax.ws.rs.core.NewCookie hoặc bất kỳ lớp nào khác với phương thức toString hữu ích để in cookie thành tiêu đề để mọi thứ trở nên đơn giản hơn.

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

Và việc sử dụng:

response.setHeader("SET-COOKIE", getHttpOnlyCookieHeader(myOriginalCookie)); 
+0

Tôi đặt lớp này ở đâu? hoặc làm thế nào để cấu hình nó? – jpganz18

+0

https://docs.oracle.com/javaee/6/api/javax/ws/rs/core/NewCookie.html – Val

+0

cảm ơn @Val nhưng tôi vẫn còn nghi ngờ, tôi thấy lớp học và tất cả các thuộc tính của nó, nhưng, cách tôi có thể bật tính năng này trên ứng dụng của mình không? – jpganz18

4

Mã này hoạt động mà không sử dụng 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); 
} 
+0

hoạt động cho tôi, cảm ơn. –

+4

Khi tôi cần sử dụng đường dẫn "/" và sử dụng cookie.setPath ("/; HttpOnly;") nó tạo cookie với Path = "/; HttpOnly;" và Chrome đánh giá sai đường dẫn là "/ value (lưu ý dấu ngoặc kép). Mặc dù tôi đã upvoted câu trả lời này trước tiên, tôi đã kết thúc bằng một câu trả lời khác ở đây sử dụng phương thức trợ giúp getHttpOnlyCookieHeader (...) – petrsyn

+1

. , nhưng không phải trong IE 11 – Jayy

3

Đối với phiên bản Java Enterprise Edition trước Jee 6, nói Servlet 2.5, bạn có thể tìm thấy một workaround từ here tại OWASP. Dưới đây là một ví dụ:

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

Đối với Servlet API 2.5, bạn có thể sử dụng

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

Hãy cẩn thận với việc sử dụng response.setHeader() vì nó sẽ xoá tất cả các cookie khác, ví dụ, Cookie JSESSIONID.

0

Mùa xuân thực hiện điều này bằng cách sử dụng sự phản chiếu mà không phá vỡ các thùng chứa servlet 2.5.

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

Tuy nhiên, phương thức setHttpOnly chỉ khả dụng trên Servlet 3.0 trở đi.

+1

Nó không phải là một ý tưởng hay: Nếu bạn có thể sử dụng sự phản chiếu để tìm ra phương thức setHttpOnly trong môi trường sản xuất/phát triển của bạn, bạn nên sửa chữa các phụ thuộc dự án của bạn trước. – mrak

3

Nếu bạn không muốn sử dụng:

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

sau đó bạn có thể sử dụng mã dưới đây vào servlet 2.5. Nó sẽ hoạt động hoàn hảo ở chrome, firefoxIE11.

Cookie cookie = new Cookie(cookieName, cookieValue); 

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

response.addCookie(cookie); 

Note: Như bạn biết rằng chúng tôi không có setHttpOnly() phương pháp trong servlet 2.5 phiên bản, vì vậy thay vì điều này bạn có thể sử dụng:

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

nó sẽ tạo ra một cookie với đường dẫn "/" và làm cho Cookie như HttpOnly

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

Trên thực tế trong trường hợp của tôi, mã này không hoạt động chính xác.
Giá trị đường dẫn không phải là "/"

Nhưng thêm điều này cookie.setComment("; HttpOnly;"); hoạt động tốt!

1

Nếu bạn không muốn hardcode HttpOnly; hoặc không muốn thêm tiêu đề, sử dụng apache shiro như thế này:

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); 
} 
Các vấn đề liên quan