Um die Rolle von OncePerRequestFilter zu verstehen , müssen wir zunächst klar verstehen, wie sich ein normaler Filter verhält. Wenn Sie möchten, dass ein bestimmter Code unmittelbar vor oder nach der Servlet-Ausführung ausgeführt wird, erstellen Sie einen Filter, der wie folgt funktioniert:
code1 ===> servlet execution (using chain.doFilter()) ===> code2
Code1 wird also vor dem Servlet und Code2 nach der Servlet-Ausführung ausgeführt. Während der Servlet-Ausführung kann es jedoch zu einer anderen Anforderung an ein anderes Servlet kommen, und dieses andere Servlet hat auch denselben Filter. In diesem Fall wird dieser Filter erneut ausgeführt.
OncePerRequestFilter verhindert dieses Verhalten. Für unsere eine Anfrage wird dieser Filter genau einmal ausgeführt (nicht mehr und nicht weniger). Dieses Verhalten ist sehr nützlich, wenn Sie mit der Sicherheitsauthentifizierung arbeiten.
Ein Filter kann als Teil eines REQUEST- oder ASYNC-Versands aufgerufen werden, der in separaten Threads erfolgt. Wir sollten OncePerRequestFilter verwenden, da wir einen Datenbankaufruf ausführen, um den Principal oder den authentifizierten Benutzer abzurufen. Es macht keinen Sinn, dies mehr als einmal zu tun. Danach setzen wir den Principal auf den Sicherheitskontext.
Dabei ist jwtTokenProvider Ihr Dienst zum Abrufen der Authentifizierung vom jwt-Token.
quelle
Eine spezielle Art von GenericFilterBean wurde eingeführt, um in der Servlet 3.0-Umgebung zu leben. Diese Version hat die Möglichkeit hinzugefügt, die Anforderungen in separaten Threads zu behandeln. Um die Ausführung mehrerer Filter in diesem Fall zu vermeiden, definiert das Spring Web-Projekt eine spezielle Art von Filter, OncePerRequestFilter. Es erweitert direkt GenericFilterBean und befindet sich als diese Klasse im Paket org.springframework.web.filter. OncePerRequestFilter definiert die doFilter-Methode. Darin wird überprüft, ob der angegebene Filter bereits angewendet wurde, indem nach dem Attribut "$ {className} .FILTER" gesucht wird, das in den Parametern der Anforderung true entspricht. Darüber hinaus wird eine abstrakte Methode doFilterInternal ((HttpServletRequest-Anforderung, HttpServletResponse-Antwort, FilterChain filterChain) definiert. Ihre Implementierungen enthalten den Code, der von einem bestimmten Filter ausgeführt werden soll, wenn der Filter nicht '
quelle