2016-11-29 6 views
1

Я использую Grizzly 2.3.24 как автономный веб-сервер для своего приложения. Поскольку Grizzly-1798 был закрыт, я бы хотел реализовать собственный SessionManager. Но, похоже, мне не хватает опции конфигурации для установки имени cookie сеанса по умолчанию.Настроить имя cookie сеанса в Grizzly

Что работает, задавая желаемое имя файла cookie непосредственно перед тем, как я получу сеанс, но это кажется сумасшедшим, нет?

Вот пример доступа к сеансу в Джерси ресурс:

@GET 
public Response testGetSession(@Context Request request) { 
    request.setSessionCookieName("mySessionCookie"); 

    Session session = request.getSession(); 
    log.info("Got session id {}", session.getIdInternal()); 

    return Response.ok().entity("hallo").build(); 
} 

Если я не указываю его request.setSessionCookieName(), то по умолчанию JSESSIONID.

Понимаю, это можно было бы сделать в RequestFilter для всех запросов, но действительно ли мне нужно идти по этому пути?

Мое предположение заключалось в том, что ответственность за определение имени печенья будет отвечать SessionManager.

ответ

0

После некоторых исследований, я считаю, что это ошибка. Я подал GRIZZLY-1877.


Update:

GRIZZLY-1877 был решен и версия 2.3.30 доступна для скачивания и в Maven центрального.

В результате обходной путь ниже не требуется. Простое выполнение SessionManager#getSessionCookieName() исправляет ситуацию.


Старый обходной путь:

В то же время (или, если v2.3.30 это не вариант), у меня есть обходной путь, используя Джерси ContainerRequestFilter установить имя куки сессии для каждого Request:

import org.glassfish.grizzly.http.server.Request; 

/** 
* Until the session cookie can be defined in the Grizzly {@link HttpServer}, 
* it will be set here. 
* <p> 
* The filter's priority ensures it gets executed before filters with 
* {@link Priorities#AUTHENTICATION}. 
* 
* @author hank 
*/ 
@Provider 
@Priority(300) // less than 1000 
@PreMatching 
public class SessionCookieFilter implements ContainerRequestFilter { 

    @Inject 
    javax.inject.Provider<Request> requestProvider; 

    @Inject 
    Config config; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     Request request = requestProvider.get(); 
     request.setSessionCookieName(config.getSessionCookieName()); 
    } 

} 
Смежные вопросы