имя cookie усекается в Servlet 3.0 HttpServletRequest (Glassfish V3) - PullRequest
0 голосов
/ 05 марта 2010

Я портирую наше промежуточное ПО для веб-аутентификации / авторизации для использования в контейнерах, реализующих новый API сервлетов 3.0 (в данном случае Glassfish V3).

Промежуточное программное обеспечение извлекает файлы cookie из фильтра HttpServletRequest для файлов cookie с именами формы «DACS: FEDERATION :: JURISDICTION: username». Это прекрасно работает в сервлете API версии 2.5, но не работает в 3.0.

Имена файлов cookie в версии 3.0 усекаются в первом «:» в имени. Я понимаю, что реализация сервлета 3.0 по умолчанию использует куки-файлы RFC 2109, которые являются более строгими в отношении имен куки-файлов, чем старая спецификация Netscape («:» входит в число символов, не разрешенных в именах куки-файлов RFC 2109).

При просмотре исходного кода сервлета 3.0 выясняется, что использование имен RFC2109 можно отключить, установив для свойства System "org.glassfish.web.rfc2109.cookie_names_enforced" значение false. Я пробовал это безрезультатно. Но кроме того, код, который использует проверки имен файлов cookie, находится в конструкторе для файла Cookie, и может показаться, что усечение происходит в другом месте.

Итак, наконец, вопрос. Другие сталкивались с такими проблемами в API сервлета 3.0 и нашли ли вы обходной путь?

1 Ответ

0 голосов
/ 06 марта 2010

Ну, если ничего не помогает, вернитесь к основам ...

Объект HttpServletRequest содержит полное действительное имя версии 0, поэтому метод 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, либо в других контейнерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...