Spring Model-Parameter mit Handler Interceptor ändern

1. Einführung

In diesem Tutorial konzentrieren wir uns auf den Spring MVC HandlerInterceptor. Insbesondere werden wir die Modellparameter von Spring MVC vor und nach der Bearbeitung einer Anfrage ändern.

Wenn Sie die Grundlagen von HandlerInterceptor lesen möchten, lesen Sie diesen Link:/spring-mvc-handlerinterceptor[Artikel].

2. Abhängigkeiten von Maven

Um Interceptors verwenden zu können, müssen Sie den folgenden Abschnitt in einen dependencies -Abschnitt Ihrer pom.xml -Datei aufnehmen:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.6.RELEASE</version>
</dependency>

Die neueste Version finden Sie unter here .

Diese Abhängigkeit gilt nur für Spring Web. Vergessen Sie nicht, s _pring-core und spring-context_ für eine vollständige Webanwendung und eine Protokollbibliothek Ihrer Wahl hinzuzufügen.

3. Benutzerdefinierte Implementierung

Einer der Anwendungsfälle von HandlerInterceptor besteht darin, einem Modell allgemeine/benutzerspezifische Parameter hinzuzufügen, die in jeder generierten Ansicht verfügbar sind.

In unserem Beispiel verwenden wir eine benutzerdefinierte Interceptor-Implementierung, um den Benutzernamen des protokollierten Benutzers zu den Modellparametern hinzuzufügen. In komplexeren Systemen können wir spezifischere Informationen hinzufügen, wie z. B. Pfad des Benutzers, Ort des Benutzers usw.

Beginnen wir mit der Definition unserer neuen Interceptor -Klasse:

public class UserInterceptor extends HandlerInterceptorAdapter {

    private static Logger log = LoggerFactory.getLogger(UserInterceptor.class);

    ...
}

Wir erweitern HandlerInterceptorAdapter , da wir nur die Methoden preHandle () und postHandle () implementieren möchten.

Wie bereits erwähnt, möchten wir den Namen des protokollierten Benutzers zu einem Modell hinzufügen.

Zunächst müssen wir überprüfen, ob ein Benutzer angemeldet ist. Diese Informationen erhalten Sie durch Prüfen von SecurityContextHolder :

public static boolean isUserLogged() {
    try {
        return !SecurityContextHolder.getContext().getAuthentication()
          .getName().equals("anonymousUser");
    } catch (Exception e) {
        return false;
    }
}

Wenn eine HttpSession eingerichtet ist, aber niemand angemeldet ist, entspricht ein Benutzername im Spring Security-Kontext anonymousUser . Als Nächstes fahren wir mit der Implementierung von preHandle () fort:

3.1. Methode preHandle ()

Bevor wir eine Anfrage bearbeiten, können wir nicht auf Modellparameter zugreifen. Um den Benutzernamen hinzuzufügen, müssen wir HttpSession verwenden, um die Parameter festzulegen:

@Override
public boolean preHandle(HttpServletRequest request,
  HttpServletResponse response, Object object) throws Exception {
    if (isUserLogged()) {
        addToModelUserDetails(request.getSession());
    }
    return true;
}

Dies ist wichtig, wenn wir einige dieser Informationen verwenden, bevor wir eine Anfrage bearbeiten. Wie wir sehen, überprüfen wir, ob ein Benutzer angemeldet ist, und fügen dann unserer Anfrage Parameter hinzu, indem er seine Sitzung abruft:

private void addToModelUserDetails(HttpSession session) {
    log.info("=============== addToModelUserDetails =========================");

    String loggedUsername
      = SecurityContextHolder.getContext().getAuthentication().getName();
    session.setAttribute("username", loggedUsername);

    log.info("user(" + loggedUsername + ") session : " + session);
    log.info("=============== addToModelUserDetails =========================");
}

Wir haben SecurityContextHolder verwendet, um loggedUsername zu erhalten. Sie können die Spring Security UserDetails -Implementierung überschreiben, um eine E-Mail anstelle eines Standardbenutzers zu erhalten.

3.2. Methode p _ostHandle () _

Nachdem wir eine Anfrage bearbeitet haben, sind unsere Modellparameter verfügbar, sodass wir darauf zugreifen können, um Werte zu ändern oder neue hinzuzufügen. Dazu verwenden wir die überschriebene Methode postHandle () :

@Override
public void postHandle(
  HttpServletRequest req,
  HttpServletResponse res,
  Object o,
  ModelAndView model) throws Exception {

    if (model != null && !isRedirectView(model)) {
        if (isUserLogged()) {
        addToModelUserDetails(model);
    }
    }
}

Schauen wir uns die Implementierungsdetails an.

Zunächst sollten Sie überprüfen, ob das Modell nicht null ist. Dies verhindert, dass wir auf eine NullPointerException__ treffen.

Darüber hinaus können wir prüfen, ob ein View keine Instanz von Redirect _View ist . _

Es ist nicht erforderlich, Parameter hinzuzufügen/zu ändern, nachdem die Anforderung bearbeitet und anschließend umgeleitet wurde, da der neue Controller sofort die Verarbeitung erneut durchführt. Um zu überprüfen, ob die Ansicht umgeleitet wird, führen wir die folgende Methode ein:

public static boolean isRedirectView(ModelAndView mv) {
    String viewName = mv.getViewName();
    if (viewName.startsWith("redirect:/")) {
        return true;
    }
    View view = mv.getView();
    return (view != null && view instanceof SmartView
      && ((SmartView) view).isRedirectView());
}

Schließlich überprüfen wir noch einmal, ob ein Benutzer angemeldet ist, und wenn ja, fügen wir dem Spring-Modell Parameter hinzu:

private void addToModelUserDetails(ModelAndView model) {
    log.info("=============== addToModelUserDetails =========================");

    String loggedUsername = SecurityContextHolder.getContext()
      .getAuthentication().getName();
    model.addObject("loggedUsername", loggedUsername);

    log.trace("session : " + model.getModel());
    log.info("=============== addToModelUserDetails =========================");
}

Bitte beachten Sie, dass die Protokollierung sehr wichtig ist, da diese Logik "hinter den Kulissen" unserer Anwendung funktioniert. Es ist leicht zu vergessen, dass wir einige Modellparameter in jedem View ändern, ohne es ordnungsgemäß zu protokollieren.

4. Aufbau

Um unseren neu erstellten Interceptor in die Spring-Konfiguration aufzunehmen, müssen wir die addInterceptors () -Methode in der WebConfig -Klasse überschreiben, die __WebMvcConfigurer implementiert:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new UserInterceptor());
}

Wir können dieselbe Konfiguration erreichen, indem wir unsere XML Spring-Konfigurationsdatei bearbeiten:

<mvc:interceptors>
    <bean id="userInterceptor" class="org.baeldung.web.interceptor.UserInterceptor"/>
</mvc:interceptors>

Ab diesem Zeitpunkt können wir auf alle benutzerbezogenen Parameter in allen generierten Ansichten zugreifen.

Wenn mehrere Spring Interceptors konfiguriert sind, wird die Methode preHandle () in der Konfigurationsreihenfolge ausgeführt, während die Methoden postHandle () und afterCompletion () in umgekehrter Reihenfolge aufgerufen werden.

5. Fazit

In diesem Lernprogramm wird das Abfangen von Webanfragen mit dem HandlerInterceptor von Spring MVC beschrieben, um Benutzerinformationen bereitzustellen.

In diesem speziellen Beispiel haben wir uns darauf konzentriert, die Details der protokollierten Benutzer in unserer Webanwendung zu Modellparametern hinzuzufügen. Sie können diese HandlerInterceptor -Implementierung erweitern, indem Sie detailliertere Informationen hinzufügen.

Alle Beispiele und Konfigurationen finden Sie hier unter GitHub .

5.1. Artikel in der Serie

Alle Artikel der Serie:

  • link:/spring-mvc-handlerinterceptor[Einführung in Spring MVC Handler

Abfangjäger]** Ändern von Frühlingsmodellparametern mit Handler-Interceptor (dieser)