2010-03-04 35 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或其他容器。