2016-05-27 5 views
2

Мне нужно сохранить идентификатор пользователя или идентификатор сеанса в нескольких таблицах после каждого обновления, чтобы узнать, какой пользователь внес изменения. Прямой/наивный подход состоит в том, чтобы передать идентификатор пользователя или идентификатор сеанса в каждом вызове dao во всех ресурсах и изменить каждое дао, чтобы принять его как параметр, а затем сохранить в db. Есть ли лучший/модульный/эффективный подход для этого?В dropwizard (с использованием jdbi с dao и объектами ресурсов), как я могу элегантно сохранять идентификатор пользователя/сеанса в таблице базы данных для каждого обновления?

+0

У вас может быть фильтр, если вы имеете в виду информацию о сеансе из вызова ресурса и обновляете все там? Если вы используете guice, у вас могут быть перехватчики, которые выполняют эту работу за вас, и комментируют методы, которые требуют такого поведения. – pandaadb

ответ

2

Если вы используете Guice (и библиотеку dropwizard-guice) внутри вашего проекта, одним из вариантов было бы создание bebe-объекта с запросом и внедрение своего провайдера внутри вашего dao. Таким образом, вы можете создать внутри вашего guice module:

@Provides 
@RequestScoped 
public SessionInfo domainContext(HttpHeaders headers) { 
    return new SessionInfo(headers.getHeaderString("sessionId")); 
} 

}

, а затем придать Provider<SessionInfo> вашему дао.

Другим вариантом является реализация фильтра запросов и установка заголовка идентификатора сеанса с использованием ThreadLocal. Это может быть, как это:

public class SessionContext { 

    private static final ThreadLocal<String> session = new ThreadLocal<>(); 

    public static String getSession() { 
     return session.get(); 
    } 

    public static void setSession(String sessionValue) { 
     session.set(sessionValue); 
    } 
} 

и простой фильтр:

@Provider 
public class SessionFilter implements ContainerRequestFilter { 
    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     SessionContext.setSession(requestContext.getHeaderString("test")); 
    } 
} 

Вы могли бы использовать SessionContext объект внутри вашего дао.