it-swarm.com.de

Wie füge ich im Frühjahr einen Filter mit WebMvcConfigurerAdapter hinzu?

Mit WebApplicationInitializer kann ich der ServletContext innerhalb der onStartup()-Methode problemlos einen Filter hinzufügen.

Wie füge ich einen Filter mit WebMvcConfigurerAdapter hinzu? Muss ich XML verwenden?

ADD 1

Um anderen das Verständnis der Spring Web-Konfiguration zu erleichtern, zeichne ich die folgende Abbildung.

Jetzt müssen Sie nur noch die rational hinter der Spring Web-Konfiguration verstehen. Wählen Sie dann die zu erbende Konfigurationsklasse und die Methode aus, die von unten überschrieben werden soll.

Es ist weniger schmerzhaft, es nachzuschlagen, als sich an so viele Dinge zu erinnern.

 enter image description here

Und ein guter Artikel über Spring Web Initialization:

http://www.kubrynski.com/2014/01/understanding-spring-web-initialization.html

HINZUFÜGEN 2

Aufgrund der Antwort von Tunaki habe ich die AbstractDispatcherServletInitializer überprüft. Die Filterregistrierung erfolgt im folgenden Code:

 enter image description here

Selbst wenn ich die grüne Methode getServletFilters() überschreibe, kann ich immer noch nicht auf das Ergebnis Dyanmic der Funktion registerServletFilter() zugreifen. Wie kann ich den Filter nach addMappingForUrlPatterns() konfigurieren?

Es scheint, dass ich have to die gesamte registerDispatcherServlet()-Methode überschreibe.

6
smwikipedia

WebMvcConfigurer ist eine Schnittstelle, die zum Anpassen der Java-basierten Konfiguration für Spring MVC verwendet wird, die über @EnableWebMvc aktiviert wird. WebMvcConfigurerAdapter ist nur ein Adapter, der leere Standardmethoden für diese Schnittstelle bereitstellt.

Es wird nicht die DispatcherServlet konfiguriert, von der Filter verwendet werden. Daher können Sie WebMvcConfigurer nicht zum Konfigurieren von Servlet-Filtern verwenden.

Um Filter einfach zu konfigurieren, können Sie von AbstractDispatcherServletInitializer erben und getServletFilters() überschreiben:

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { new CharacterEncodingFilter() };
    }

}

Wenn Sie einen Filter weiter konfigurieren möchten, müssen Sie stattdessen onStartup überschreiben:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext);
    servletContext.addFilter("name", CharacterEncodingFilter.class)
                  .addMappingForUrlPatterns(null, false, "/*");
}
11
Tunaki

Sie können auf das dynamische Ergebnis von registerServletFilter() wie folgt in Ihrer App-Konfiguration zugreifen (insbesondere WebApplicationInitializer ):

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

    // Create the 'root' Spring application context
    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();

    rootContext.register(
        AppConfig.class,
        SecurityConfiguration.class,
        HibernateConfiguration.class 
    );

    // Add cuatom filters to servletContext
    FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("recaptchaResponseFilter", new RecaptchaResponseFilter());
    filterRegistration.setInitParameter("encoding", "UTF-8");
    filterRegistration.setInitParameter("forceEncoding", "true");
    filterRegistration.addMappingForUrlPatterns(null, true, "/*");

    // Create the dispatcher servlet's Spring application context
    AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
    dispatcherServlet.register(MVCConfig.class);

    // Register and map the dispatcher servlet
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
0
Psypher

Sie können Spring Beans erstellen, in denen Filter und @Inject ServletContext implementiert sind. Anschließend können Sie sie in einer @ PostConstruct-Methode mit servletContext.addServlet ("myFilter", this) registrieren.

public class MyFilter implements Filter {
    @Inject
    private ServletContext servletContext;

    @PostConstruct
    public void init(){
        ServletRegistration.Dynamic filter = servletContext.addServlet("myFilter",this);
        filter.addMapping("/myMapping");
    }
}

Die Bean darf nicht in dem mit ContextLoaderListener (rootContext) initialisierten rootContext deklariert werden, da die Servlet 3.0-API die Verwendung der dynamischen Registrierung für die Listener verbietet. Es muss also in dem DispatcherContext deklariert werden, der an DispatcherServlet (DispatcherContext) übergeben wird.

public class MyWebAppInitializer implements WebApplicationInitializer {

   @Override
   public void onStartup(ServletContext container) {
     // Create the 'root' Spring application context
     AnnotationConfigWebApplicationContext rootContext =
       new AnnotationConfigWebApplicationContext();
     rootContext.register(AppConfig.class);

     // Manage the lifecycle of the root application context
     container.addListener(new ContextLoaderListener(rootContext));

     // Create the dispatcher servlet's Spring application context
     AnnotationConfigWebApplicationContext dispatcherContext =
       new AnnotationConfigWebApplicationContext();
     dispatcherContext.register(DispatcherConfig.class);

     // Register and map the dispatcher servlet
     ServletRegistration.Dynamic dispatcher =
       container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
     dispatcher.setLoadOnStartup(1);
     dispatcher.addMapping("/");
   }

}

Frühling doc

0
Mirak