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?
2
A
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.
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