2012-10-30 10 views
17

यहाँ के साथ एक केवल Http कुकी की स्थापना एक समारोह है कि एक कुकी सेट है। दुर्भाग्य से मेरा संगठन 2.5 और अपग्रेडिंग का उपयोग इस समय एक विकल्प नहीं है।javax.servlet 2.5

कुकी सेट करने के लिए प्रतिक्रिया का उपयोग करने का कोई तरीका है? यहाँ एक उदाहरण मैं ऑनलाइन पाया

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

है इस मैं क्या चाहते करने के लिए एक ही रास्ता है, तो मैं क्या जगह लेंगे "[कुछ STUFF]" के साथ इतना है कि मैं डेटा है कि मेरे समारोह के किसी भी खोना नहीं है वर्तमान में कुकी में स्टोर करता है?

+2

मुझे पता है यह एक पुराने सवाल है, लेकिन मैं एक समाधान के साथ आया था - मेरे देखना जवाब [आप टोमकैट/जावा वेबपैप्स में केवल कुकीज़ को कैसे कॉन्फ़िगर करते हैं?] (http://stackoverflow.com/a/14610452/9822) –

उत्तर

9

आप सही हैं, मैन्युअल रूप से हेडर सेट करना आपके लक्ष्य को प्राप्त करने का सही तरीका है।

आप javax.ws.rs.core का उपयोग भी कर सकते हैं। न्यूक्यूकी या किसी भी अन्य वर्ग को कुकी को प्रिंट करने के लिए उपयोगी टूस्टिंग विधि के साथ चीजों को और अधिक सरल बनाने के लिए।

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)); 
+0

मैं इस कक्षा को कहां सेट करूं? या मैं इसे कैसे कॉन्फ़िगर कर सकता हूं? – jpganz18

+0

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

+0

धन्यवाद @ वैल लेकिन मुझे अभी भी संदेह है, मैं कक्षा और इसकी सभी संपत्तियों को देखता हूं, लेकिन, कैसे क्या मैं इसे अपने ऐप पर सक्षम कर सकता हूं? – jpganz18

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

मेरे लिए काम करता है, धन्यवाद। –

+4

जब मुझे पथ "/" का उपयोग करने की आवश्यकता होती है और cookie.setPath ("/; HttpOnly;") का उपयोग करें, यह कुकी = "/; HttpOnly;" के साथ कुकी उत्पन्न करता है और क्रोम गलत तरीके से पथ का मूल्यांकन करता है "/ मान (उद्धरण चिह्न पर ध्यान दें)। भले ही मैंने इस उत्तर को ऊपर उठाया, फिर भी मैं यहां एक और उत्तर के साथ समाप्त हुआ जो getHttpOnlyCookieHeader (...) सहायक विधि का उपयोग करता है। – petrsyn

+1

यह फ़ायरफ़ॉक्स के साथ ठीक काम कर रहा है , लेकिन आईई 11 – Jayy

3

जावा एंटरप्राइज़ संस्करण संस्करणों पहले जेईई 6, करने के लिए सर्वलेट 2.5 कहते हैं, आप एक मिल सकता है ओडब्ल्यूएएसपी पर 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()); 
    } 
3

सर्वलेट एपीआई 2.5 के लिए, आप क्योंकि यह अन्य सभी कुकीज़ हटाता है, उदाहरण के लिए उपयोग कर सकते हैं

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

response.setHeader() के उपयोग के साथ सावधान रहें,: नीचे एक उदाहरण है JSESSIONID कुकी।

0

वसंत सर्वलेट 2.5 कंटेनर पर तोड़ने के बिना प्रतिबिंब का उपयोग करके करता है।

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

हालांकि सेट एचटीपी केवल विधि केवल सर्वलेट 3.0 पर ही उपलब्ध है।

+1

में यह एक अच्छा विचार नहीं है: यदि आप अपने उत्पादन/विकास पर्यावरण पर सेटहटपॉली विधि को खोजने के लिए प्रतिबिंब का उपयोग कर सकते हैं, तो आपको पहले अपनी परियोजना निर्भरताओं को ठीक करना चाहिए। ओपी क्या नहीं पूछ रहा था। – mrak

3

आप का उपयोग नहीं करना चाहते हैं:

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

तो आप सर्वलेट 2.5 में नीचे दिए गए कोड का उपयोग कर सकते हैं। यह क्रोम, फ़ायरफ़ॉक्स और IE11 में सही काम करेगा।

Cookie cookie = new Cookie(cookieName, cookieValue); 

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

response.addCookie(cookie); 

नोट: क्या आप जानते हैं कि हम setHttpOnly() में विधि सर्वलेट 2 की जरूरत नहीं है के रूप में।5 संस्करण, इस बात का तो बजाय आप का उपयोग कर सकते हैं:

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

यह पथ "/" के साथ एक कुकी बनाना होगा और कुकी बनाने रूप केवल Http

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

मेरे मामले में, यह कोड बिल्कुल काम नहीं करता है।
पथ मान "/"

लेकिन यह cookie.setComment("; HttpOnly;"); ठीक काम करता है!

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