2016-05-27 20 views
2

Ich muss Benutzer-ID oder Sitzungs-ID in einigen Tabellen nach jedem Update speichern, um zu wissen, welcher Benutzer die Änderung vorgenommen hat. Der einfache/naive Ansatz besteht darin, bei jedem Dao-Aufruf in allen Ressourcen Benutzer-ID oder Sitzungs-ID zu übergeben und jeden Dao als Parameter zu übernehmen und dann in db zu speichern. Gibt es dafür einen besseren/modularen/effizienten Ansatz?In DropWizard (mit jdbi mit Dao und Ressourcen-Objekte), Wie kann ich Benutzer-ID/Sitzung in der Datenbanktabelle für jedes Update elegant speichern?

+0

Sie könnten einen Filter haben, falls Sie eine Sitzungsinformation von einem Ressourcenanruf meinen und alles darin aktualisieren? Wenn Sie guice verwenden, können Sie Interceptors verwenden, die für Sie arbeiten, und die Methoden mit Anmerkungen versehen, die dieses Verhalten erfordern. – pandaadb

Antwort

2

Wenn Sie Guice (und dropwizard-guice library) in Ihrem Projekt verwenden, wäre eine Option, Request Scoped Bean zu erstellen und seinen Provider in Ihr Dao zu injizieren. So könnten Sie in Ihrem guice module erstellen:

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

}

und dann injizieren Provider<SessionInfo> zu Ihrem dao.

Eine weitere Option besteht darin, Anforderungsfilter zu implementieren und den Sitzungs-ID-Header mithilfe von ThreadLocal festzulegen. Es könnte so aussehen:

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); 
    } 
} 

und einfachen Filter:

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

Sie dann SessionContext Objekt in Ihrem dao nutzen könnte.