Вопрос:

Как добавить класс фильтра в Spring Boot?

java configuration spring-boot servlet-filters

218893 просмотра

20 ответа

3703 Репутация автора

Интересно, есть ли какая-нибудь аннотация для Filterкласса (для веб-приложений) в Spring Boot? Возможно @Filter?

Я хочу добавить пользовательский фильтр в свой проект.

Упоминалось о справочном руководстве по Spring BootFilterRegistrationBean , но я не уверен, как его использовать.

Автор: janetsmith Источник Размещён: 07.11.2013 12:52

Ответы (20)


71 плюса

45456 Репутация автора

Специальной аннотации для обозначения фильтра сервлетов не существует. Вы просто объявляете @Beanтип Filter(или FilterRegistrationBean). Пример (добавление настраиваемого заголовка ко всем ответам) находится в собственной загрузочной EndpointWebMvcAutoConfiguration ;

Если вы только объявите, Filterон будет применен ко всем запросам. Если вы также добавите, FilterRegistrationBeanвы можете дополнительно указать отдельные сервлеты и шаблоны URL для применения.

Замечания:

Начиная с Spring Boot 1.4, FilterRegistrationBeanон не устарел и просто перемещает пакеты из org.springframework.boot.context.embedded.FilterRegistrationBeanвorg.springframework.boot.web.servlet.FilterRegistrationBean

Автор: Dave Syer Размещён: 07.11.2013 08:17

107 плюса

1101 Репутация автора

Вот пример одного метода включения пользовательского фильтра в приложение Spring Boot MVC. Обязательно включите пакет в проверку компонентов:

package com.dearheart.gtsc.filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
public class XClacksOverhead implements Filter {

  public static final String X_CLACKS_OVERHEAD = "X-Clacks-Overhead";

  @Override
  public void doFilter(ServletRequest req, ServletResponse res,
      FilterChain chain) throws IOException, ServletException {

    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader(X_CLACKS_OVERHEAD, "GNU Terry Pratchett");
    chain.doFilter(req, res);
  }

  @Override
  public void destroy() {}

  @Override
  public void init(FilterConfig arg0) throws ServletException {}

}
Автор: tegatai Размещён: 22.03.2015 06:18

137 плюса

8278 Репутация автора

Если вы хотите настроить сторонний фильтр, вы можете использовать FilterRegistrationBean. Например, эквивалент web.xml

<filter>
     <filter-name>SomeFilter</filter-name>
        <filter-class>com.somecompany.SomeFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SomeFilter</filter-name>
    <url-pattern>/url/*</url-pattern>
    <init-param>
       <param-name>paramName</param-name>
       <param-value>paramValue</param-value>
    </init-param>
</filter-mapping>

Это будут две бобы в вашем @Configurationфайле

@Bean
public FilterRegistrationBean someFilterRegistration() {

    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(someFilter());
    registration.addUrlPatterns("/url/*");
    registration.addInitParameter("paramName", "paramValue");
    registration.setName("someFilter");
    registration.setOrder(1);
    return registration;
} 

public Filter someFilter() {
    return new SomeFilter();
}

Выше был протестирован с пружинной загрузкой 1.2.3

Автор: Haim Raman Размещён: 05.06.2015 05:09

65 плюса

1839 Репутация автора

Есть три способа добавить свой фильтр,

  1. Аннотируйте свой фильтр одним из стереотипов Spring, таким как @Component
  2. Зарегистрироваться @Beanс Filterтипом весной@Configuration
  3. Зарегистрироваться @Beanс FilterRegistrationBeanтипом весной@Configuration

Либо № 1, либо № 2 подойдет, если вы хотите, чтобы ваш фильтр применялся ко всем запросам без настройки, используйте № 3 в противном случае. Вам не нужно указывать компонентное сканирование для # 1, чтобы работать, пока вы помещаете свой класс фильтра в тот же или вложенный пакет вашего SpringApplicationкласса. Для # 3 использование вместе с # 2 необходимо только в том случае, если вы хотите, чтобы Spring управлял вашим классом фильтра, таким как наличие автоматических проводных зависимостей. Это прекрасно работает для меня, чтобы новый мой фильтр, который не нуждается в автопроводке / инъекции зависимостей.

Хотя объединение № 2 и № 3 работает нормально, я был удивлен, что в итоге два фильтра не применяются дважды. Я предполагаю, что Spring объединяет два bean-компонента как один, когда вызывает один и тот же метод для создания их обоих. Если вы хотите использовать # 3 в одиночку с автопереходом, вы можете AutowireCapableBeanFactory. Ниже приведен пример,

private @Autowired AutowireCapableBeanFactory beanFactory;

    @Bean
    public FilterRegistrationBean myFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        Filter myFilter = new MyFilter();
        beanFactory.autowireBean(myFilter);
        registration.setFilter(myFilter);
        registration.addUrlPatterns("/myfilterpath/*");
        return registration;
    }
Автор: barryku Размещён: 16.12.2015 01:24

14 плюса

11472 Репутация автора

Из весенних документов,

Встроенные контейнеры сервлетов - добавление сервлета, фильтра или прослушивателя в приложение

Чтобы добавить Servlet, Filter или Servlet * Listener, предоставьте для него определение @Bean .

Например:

@Bean
public Filter compressFilter() {
    CompressingFilter compressFilter = new CompressingFilter();
    return compressFilter;
}

Добавьте этот @Beanконфиг в ваш @Configurationкласс, и фильтр будет зарегистрирован при запуске.

Также вы можете добавлять сервлеты, фильтры и прослушиватели, используя сканирование пути к классам,

Аннотированные классы @WebServlet, @WebFilter и @WebListener можно автоматически зарегистрировать во встроенном контейнере сервлетов, пометив класс @Configuration с помощью @ServletComponentScan и указав пакет (ы), содержащий компоненты, которые вы хотите зарегистрировать. По умолчанию @ServletComponentScan будет сканировать из пакета аннотированного класса.

Автор: Lucky Размещён: 08.08.2016 01:37

18 плюса

409 Репутация автора

Вот пример моего пользовательского класса Filter:

package com.dawson.controller.filter;

import org.springframework.stereotype.Component;
import org.springframework.web.filter.GenericFilterBean;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@Component
public class DawsonApiFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if (req.getHeader("x-dawson-nonce") == null || req.getHeader("x-dawson-signature") == null) {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.setContentType("application/json");
            httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Required headers not specified in the request");
            return;
        }
        chain.doFilter(request, response);
    }
}

И я добавил его в конфигурацию загрузки Spring, добавив его в класс Configuration следующим образом:

package com.dawson.configuration;

import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import com.dawson.controller.filter.DawsonApiFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@SpringBootApplication
public class ApplicationConfiguration {
    @Bean
    public FilterRegistrationBean dawsonApiFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new DawsonApiFilter());
// In case you want the filter to apply to specific URL patterns only
        registration.addUrlPatterns("/dawson/*");
        return registration;
    }
}
Автор: DPancs Размещён: 02.05.2017 05:47

7 плюса

1080 Репутация автора

Если вы используете Spring Boot + Spring Security, вы можете сделать это в конфигурации безопасности.

В приведенном ниже примере я добавляю пользовательский фильтр перед именем UsernamePasswordAuthenticationFilter (см. Все фильтры Spring Security по умолчанию и их порядок ).

@EnableWebSecurity
class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired FilterDependency filterDependency;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .addFilterBefore(
                new MyFilter(filterDependency),
                UsernamePasswordAuthenticationFilter.class);
    }
}

И класс фильтра

class MyFilter extends OncePerRequestFilter  {
    private final FilterDependency filterDependency;

    public MyFilter(FilterDependency filterDependency) {
        this.filterDependency = filterDependency;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request,
        HttpServletResponse response,
        FilterChain filterChain)
        throws ServletException, IOException {
       // filter
       filterChain.doFilter(request, response);
    }
}
Автор: Andrei Epure Размещён: 06.07.2017 10:40

2 плюса

51 Репутация автора

Вы можете использовать @WebFilter javax.servlet.annotation.WebFilter в классе, который реализует javax.servlet.Filter.

@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {}

Затем используйте @ServletComponentScan для регистрации

Автор: Cwrwhaf Размещён: 18.07.2017 10:41

5 плюса

4672 Репутация автора

Используя аннотацию @WebFilter, это можно сделать следующим образом:

@WebFilter(urlPatterns = {"/*" })
public class AuthenticationFilter implements Filter{

    private static Logger logger = Logger.getLogger(AuthenticationFilter.class);

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

         logger.info("checking client id in filter");
        HttpServletRequest request = (HttpServletRequest) arg0;
        String clientId = request.getHeader("clientId");
        if (StringUtils.isNotEmpty(clientId)) {
            chain.doFilter(request, response);
        } else {
            logger.error("client id missing.");
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}
Автор: KayV Размещён: 23.08.2017 07:31

-5 плюса

29 Репутация автора

Фильтры в основном используются в файлах логгеров, они различаются в зависимости от логгера, который вы используете в проекте Lemme объяснение для log4j2:

<Filters>
                <!-- It prevents error -->
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <!-- It prevents debug -->
                <ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL" />
                <!-- It allows all levels except debug/trace -->
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> 
            </Filters>

Фильтры используются для ограничения данных, и я использовал пороговый фильтр для ограничения уровней данных в потоке. Я упомянул уровни, которые могут быть там ограничены. Для дальнейшего использования см. Порядок уровней log4j2 - Log4J Levels: ALL> TRACE> DEBUG> INFO> WARN> ERROR> FATAL> OFF

Автор: saravanan Размещён: 10.11.2017 01:03

23 плюса

2378 Репутация автора

ОБНОВЛЕНИЕ: 2017-12-16:

Есть два простых способа сделать это в Spring Boot 1.5.8.RELEASE, нет необходимости в XML.

Первый способ: если у вас нет пространственного шаблона URL, вы можете использовать @Component следующим образом: (полный код и подробности здесь https://www.surasint.com/spring-boot-filter/ )

@Component
public class ExampleFilter implements Filter{
   ...
}

Второй способ: если вы хотите использовать шаблоны URL, вы можете использовать @WebFilter следующим образом: (полный код и подробности здесь https://www.surasint.com/spring-boot-filter-urlpattern/ )

@WebFilter(urlPatterns = "/api/count")
public class ExampleFilter implements Filter{
 ...
}

Но вам также нужно добавить аннотацию @ServletComponentScan в ваш класс @SpringBootApplication:

@ServletComponentScan
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
...
}

Обратите внимание, что @Component - это аннотация Spring, а @WebFilter - нет. @WebFilter - это аннотация Servlet 3.

В обоих случаях вам просто нужна базовая зависимость Spring Boot в pom.xml (нет необходимости в явном встроенном в tascat jasper)

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
    </parent>

    <groupId>com.surasint.example</groupId>
    <artifactId>spring-boot-04</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

ВНИМАНИЕ: Во-первых, если контроллер в Spring Boot возвращается в файл JSP, запрос дважды проходит фильтр.

Хотя, во-вторых, запрос пройдет фильтр только один раз.

Я предпочитаю второй способ, потому что он больше похож на поведение по умолчанию в спецификации сервлета ( https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html )

Вы можете увидеть больше журнала испытаний здесь https://www.surasint.com/spring-boot-webfilter-instead-of-component/

Автор: Surasin Tancharoen Размещён: 16.12.2017 01:10

1 плюс

33 Репутация автора

Вы также можете сделать фильтр с помощью @WebFilter и реализовать фильтр, это будет делать.

 @Configuration
        public class AppInConfig 
        {
        @Bean
      @Order(1)
      public FilterRegistrationBean aiFilterRegistration() {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(new TrackingFilter());
            registration.addUrlPatterns("/**");
            registration.setOrder(1);
            return registration;
        } 
    @Bean(name = "TrackingFilter")
        public Filter TrackingFilter() {
            return new TrackingFilter();
        }   
    }
Автор: Muni Размещён: 05.01.2018 09:07

0 плюса

1 Репутация автора

First, add @ServletComponentScan to your SpringBootApplication class.

@ServletComponentScan
public class Application {

Second, create a filter file extending Filter or third-party filter class and add @WebFilter to this file like this:

@Order(1) //optional
@WebFilter(filterName = "XXXFilter", urlPatterns = "/*",
    dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD},
    initParams = {@WebInitParam(name = "confPath", value = "classpath:/xxx.xml")})
public class XXXFilter extends Filter{
Автор: oaoit Размещён: 06.02.2018 05:54

2 плюса

3850 Репутация автора

Я видел много ответов здесь, но я не пробовал ни одного из них. Я только что создал фильтр, как в следующем коде.

import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/Admin")
@Configuration
public class AdminFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse  servletResponse, FilterChain filterChain) throws IOException, ServletException      {
    System.out.println("happened");

    }

    @Override
    public void destroy() {

    }
}

И оставил оставшееся приложение Spring Boot как есть.

Автор: Shaaban Ebrahim Размещён: 26.02.2018 07:15

2 плюса

1183 Репутация автора

Это скорее совет, чем ответ, но если вы используете Spring MVC в своем веб-приложении, хорошей идеей является использование Spring HandlerInterceptor вместо Filter

Он может выполнять ту же работу, но также - Может работать с ModelAndView - Его методы можно вызывать до и после обработки запроса или после завершения запроса.
- Это может быть легко проверено

1 Реализуйте интерфейс HandlerInterceptor и добавьте аннотацию @Component в свой класс

@Component
public class SecurityInterceptor implements HandlerInterceptor {

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

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        request.getSession(true);
        if(isLoggedIn(request))
            return true;

        response.getWriter().write("{\"loggedIn\":false}");
        return false;
    }

    private boolean isLoggedIn(HttpServletRequest request) {
        try {
            UserSession userSession = (UserSession) request.getSession(true).getAttribute("userSession");
            return userSession != null && userSession.isLoggedIn();
        } catch(IllegalStateException ex) {
            return false;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

    }
}

2 Настройте ваш перехватчик

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private HandlerInterceptor securityInterceptor;

    @Autowired
    public void setSecurityInterceptor(HandlerInterceptor securityInterceptor) {
        this.securityInterceptor = securityInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(securityInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/logout");
    }

}
Автор: Vasily Komarov Размещён: 02.04.2018 11:43

0 плюса

33 Репутация автора

@WebFilter(urlPatterns="/*")
public class XSSFilter implements Filter {

    private static final org.apache.log4j.Logger LOGGER = LogManager.getLogger(XSSFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        LOGGER.info("Initiating XSSFilter... ");

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpRequestWrapper requestWrapper = new HttpRequestWrapper(req);
        chain.doFilter(requestWrapper, response);
    }

    @Override
    public void destroy() {
        LOGGER.info("Destroying XSSFilter... ");
    }

}

You need to implement Filter and need to be annotated with @WebFilter(urlPatterns="/*")

And in Application or Configuration class you need to add @ServletComponentScan By this it your filter will get registered.

Автор: Rahul Anand Размещён: 06.06.2018 11:31

0 плюса

835 Репутация автора

I saw answer by @Vasily Komarov. Similar approach, but using abstract HandlerInterceptorAdapter class instead of using HandlerInterceptor.

Here is an example...

@Component
public class CustomInterceptor extends HandlerInterceptorAdapter {
   @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    }
}

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private CustomInterceptor customInterceptor ;

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

}
Автор: Shaunak Patel Размещён: 13.06.2018 05:55

0 плюса

51 Репутация автора

As you all know, Spring Boot is a wonderful way of developing a WebApp or StandaloneApp with minimum configuration and opinionated Setup.

This is how I have achieved a Web Filter Development in Spring Boot application

My SpringBootApp Specifications:-

Версия Spring Boot: 2.0.4.RELEASE
Версия Java: 8.0
Servlet Спецификация: Servlet 3.0 (обязательно и важно)

Я объявил свой веб-фильтр следующим образом, придерживаясь спецификаций сервлета 3.0

введите описание изображения здесь Это программный способ определения фильтра как замены определений на основе web.xml.

Аннотация «@Webfilter» будет обрабатываться контейнером во время развертывания, класс Filter, в котором он найден, будет создан в соответствии с конфигурацией и применен к шаблонам URL, javax.servlet.Servlets и javax.servlet.DispatcherTypes.

Чтобы полностью избежать Web.xml и добиться «Deployable» WebApp: -

Чтобы развернуть Spring Boot Application как «Традиционную WAR», класс приложения должен расширять SpringBootServletInitializer.

ПРИМЕЧАНИЕ :: SpringBootServletInitializer - это «программная реализация» файла web.xml со ссылкой на спецификации Servlet 3.0+, для которых требуется реализация WebApplicationInitializer.

Таким образом, SpringBootApplication не требует "web.xml", так как его класс Application (после расширения SpringBootServletInitializer) сканирует для
- @WebFilter,
- @WebListener и
- @WebServlet.

Аннотация @ServletComponentScan

Эта аннотация позволяет сканировать базовые пакеты для веб-компонентов, аннотированных @WebFilter, @WebListener и @WebServlet.

В связи с тем, что встроенные контейнеры не поддерживают аннотации @WebServlet, @WebFilter и @WebListener, Spring Boot, в значительной степени опираясь на встроенные контейнеры, представил эту новую аннотацию @ServletComponentScan для поддержки некоторых зависимых jar-файлов, которые используют эти 3 аннотации.

Сканирование выполняется только при использовании встроенного контейнера сервлетов.

Ниже приведено определение класса приложения Spring Boot: -

введите описание изображения здесь

Пользовательский инициализатор сервлета: -

Здесь: я определил пользовательский класс: «ServletInitializer», который расширяет класс: SpringBootServletInitializer.

Как объяснялось ранее, SpringBootServletInitializer отвечает за сканирование аннотаций: -
- @WebFilter,
- @WebListener и
- @WebServlet.

И, следовательно, класс приложения Spring Boot должен

  • Либо расширить класс: SpringBootServletInitializer ИЛИ
  • расширить пользовательский класс, который расширяет класс: SpringBootServletInitializer

введите описание изображения здесь

Автор: Philip Dilip Размещён: 07.04.2019 10:22

1 плюс

346 Репутация автора

Фильтры, как следует из названия, используются для выполнения фильтрации либо запроса к ресурсу, либо ответа от ресурса, либо обоих. Spring Boot предоставляет несколько вариантов регистрации пользовательских фильтров в приложении Spring Boot. Давайте посмотрим на разные варианты.

1. Определите весенний загрузочный фильтр и порядок вызова

Внедрите интерфейс Filter для создания нового фильтра в Spring Boot.

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomFilter implements Filter {

 private static final Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class);

 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
  LOGGER.info("########## Initiating Custom filter ##########");
 }

 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

  HttpServletRequest request = (HttpServletRequest) servletRequest;
  HttpServletResponse response = (HttpServletResponse) servletResponse;

  LOGGER.info("Logging Request  {} : {}", request.getMethod(), request.getRequestURI());

  //call next filter in the filter chain
  filterChain.doFilter(request, response);

  LOGGER.info("Logging Response :{}", response.getContentType());
 }

 @Override
 public void destroy() {
  // TODO: 7/4/18
 }
}

Давайте быстро посмотрим на некоторые важные моменты в приведенном выше коде

  • The filter registered by @Component annotation.
  • To fire filters in the right order–we needed to use the @Order annotation.

    @Component
    @Order(1)
    public class CustomFirstFilter implements Filter {
    
    }
    @Component
    @Order(2)
    public class CustomSecondFilter implements Filter {
    
    }
    

In the above code, CustomFirstFilter will run before the CustomSecondFilter.

The lower the number, the higher the precedence

2. URL Pattern

If the convention-based mapping is not flexible enough, we can use FilterRegistrationBean for the complete control of the application. Here, don’t use @Component annotation for the filter class but register the filter using a FilterRegistrationBean.

 public class CustomURLFilter implements Filter {

 private static final Logger LOGGER = LoggerFactory.getLogger(CustomURLFilter.class);

 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
  LOGGER.info("########## Initiating CustomURLFilter filter ##########");
 }

 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

  HttpServletRequest request = (HttpServletRequest) servletRequest;
  HttpServletResponse response = (HttpServletResponse) servletResponse;

  LOGGER.info("This Filter is only called when request is mapped for /customer resource");

  //call next filter in the filter chain
  filterChain.doFilter(request, response);
 }

 @Override
 public void destroy() {

 }
}

Register the custom Filter using FilterRegistrationBean.

@Configuration
public class AppConfig {

 @Bean
 public FilterRegistrationBean < CustomURLFilter > filterRegistrationBean() {
  FilterRegistrationBean < CustomURLFilter > registrationBean = new FilterRegistrationBean();
  CustomURLFilter customURLFilter = new CustomURLFilter();

  registrationBean.setFilter(customURLFilter);
  registrationBean.addUrlPatterns("/greeting/*");
  registrationBean.setOrder(2); //set precedence
  return registrationBean;
 }
}
Автор: Yogesh Размещён: 29.05.2019 11:09

0 плюса

16 Репутация автора

Этот фильтр также поможет вам разрешить перекрестное происхождение

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCORSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "20000");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN");

        if("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
}


public void destroy() {}

@Override
public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub

}

}

Автор: Ghulam Murtaza Размещён: 24.07.2019 12:50
Вопросы из категории :
32x32