2010-03-04 30 views
0

我正在移植我們的Web認證/授權中間件,以用於實現新servlet 3.0 API(在這種情況下是Glassfish V3)的容器中。在Servlet 3.0中截斷cookie名稱HttpServletRequest(GlassFish V3)

中間件從cookie「HttpServletRequest」中過濾Cookie,其名稱爲「DACS:FEDERATION :: JURISDICTION:username」。這在2.5版本servlet API中工作正常,但在3.0版本中被破壞。

3.0中的cookie名稱在名稱的第一個「:」處被截斷。據我所知,servlet 3.0實現默認爲RFC 2109 cookie,它比舊的Netscape規範(RFC 2109 cookie名稱中不允許使用的字符之一)中的cookie名稱更具限制性。

挖掘到servlet 3.0源代碼,似乎可以通過將System屬性「org.glassfish.web.rfc2109.cookie_names_enforced」設置爲false來禁用RFC2109名稱的使用。我試過這個無濟於事。但除此之外,使用檢查cookie名稱的代碼位於Cookie的構造函數中,並且看起來截斷髮生在別處。

所以 - 最後 - 問題。讓其他人在servlet 3.0 API中遇到這樣的問題並找到解決方法?

回答

0

那麼,如果一切都失敗了,回到基礎...

HttpServletRequest對象包含了一個完整有效的版本0 cookiename,所以request.getCookies()方法可以被繞過。

例如,假設我們在我們的中間件使用HttpClient的4(DacsCookie延伸BasicClientCookie):

public static List<DacsCookie> getDacsCookies(Federation federation, Enumeration cookieHeaders) { 
    String federationName = federation.getFederationName(); 
    String federationDomain = federation.getFederationDomain(); 
    List<DacsCookie> dacsCookies = new ArrayList<DacsCookie>(); 
    while (cookieHeaders.hasMoreElements()) { 
     String cookieHeader = (String) cookieHeaders.nextElement(); 
     Pattern name = Pattern.compile("(DACS:[:\\w]+)=([-\\w]+)"); 
     Matcher m = name.matcher(cookieHeader); 
     while (m.find()) { 
      String cookieName = m.group(1); 
      String cookieValue = m.group(2); 
      DacsCookieName dacsCookieName = DacsCookieName.valueOf(cookieName); 
      if (dacsCookieName != null && federationName.equals(dacsCookieName.getFederationPart())) { 
       Jurisdiction jurisdiction = federation.getJurisdictionByName(dacsCookieName.getJurisdictionPart()); 
       dacsCookies.add(new DacsCookie(federationDomain, cookieName, cookieValue, jurisdiction.isSecure())); 
      } 
     } 
    } 
    return dacsCookies; 
} 

public static Enumeration getCookieHeaders(HttpServletRequest request) { 
    return request.getHeaders("cookie"); 
} 

我仍然有興趣知道其他人碰到了這個問題無論是在Glassfish的V3或其他容器。