स्प्रिंग बूट में फ़िल्टर क्लास कैसे जोड़ें?


229

मुझे आश्चर्य है, अगर Filterस्प्रिंग बूट में एक वर्ग (वेब ​​अनुप्रयोगों के लिए) के लिए कोई एनोटेशन है ? शायद @Filter?

मैं अपने प्रोजेक्ट में एक कस्टम फ़िल्टर जोड़ना चाहता हूं।

स्प्रिंग बूट संदर्भ गाइड के बारे में उल्लेख किया गया है FilterRegistrationBean, लेकिन मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जाए।


ध्यान दें, कि @WebFilter के साथ जोड़ा गया फ़िल्टर सर्वलेट कल्पना में एक वास्तविक फ़िल्टर की तरह व्यवहार नहीं करता है। यह एक स्प्रिंग बीन होगा जिसे कई अन्य स्प्रिंग बीन्स के बाद कहा जाता है और किसी भी सर्वलेट कोड से पहले वास्तविक फिल्टर की तरह नहीं।
lrxw

क्या आप मुझे सही आवश्यकता बता सकते हैं यदि आप ComponentScan के लिए फ़िल्टर क्लासेस चाहते हैं तो उस "@ ComponentScan.Filter" के लिए एक एनोटेशन है
Keaz

जवाबों:


159

यदि आप किसी तृतीय-पक्ष फ़िल्टर को सेटअप करना चाहते हैं, जिसका आप उपयोग कर सकते हैं 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 के साथ किया गया था


1
क्या होगा अगर मैं कई फिल्टर जोड़ना चाहता हूं? @Opal
verystrongjoe

8
बस एक अतिरिक्त @Bean सार्वजनिक FilterRegistrationBean अतिरिक्तFilterRegistration () जोड़ें
Haim Raman

जिस क्रम में फ़िल्टर लगाए जाते हैं, वह कैसे पता चलता है?
बीपडॉग

7
FilterRegistrationBean.setOrder
हैम रमन

जब आप विधि को someFilter()सीधे कॉल करते हैं तो आपको फ़िल्टर बीन की आवश्यकता नहीं होती है ।
WST

117

स्प्रिंग बूट 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 {}

}

4
क्या फिल्टर को कहीं पंजीकृत किया जाना चाहिए?
gstackoverflow

1
जब मैंने उस दृष्टिकोण की कोशिश की, तो फ़िल्टर को बीन के रूप में बनाया गया था और यहां तक ​​कि अन्य वर्ग को भी इंजेक्ट किया गया था, लेकिन init () विधि नहीं चली थी । संभवतः, init () केवल 'सामान्य' में काम करता है, जो वसंत कंटेनर द्वारा पंजीकृत नहीं है। मुझे लगता है, एक init () के बजाय PostConstruct का उपयोग कर सकता है, लेकिन मैंने कोशिश नहीं की कि मैंने फ़िल्टर को स्प्रिंग बीन घोषित करने से इनकार कर दिया।
बाउरजान १

इस दृष्टिकोण का उपयोग करके फ़िल्टर ऑर्डर के बारे में क्या?
पावेल

हम कैसे सर्वलेट से आरएस बॉडी प्राप्त कर सकते हैं?
user2602807

1
ध्यान देने वाली एक महत्वपूर्ण बात यह है कि आपके बीन का नाम (आपकी कक्षा के नाम के आधार पर) स्प्रिंग बीन के समान नहीं होना चाहिए। उदाहरण के लिए, आपको एक बनाने के लिए लुभाया जा सकता है MetricsFilter, लेकिन इस बीन को उसी नाम के स्प्रिंग एक्ट्यूएटर सेम द्वारा ओवरशेड किया जाएगा।
जानिए

78

सर्वलेट फ़िल्टर को निरूपित करने के लिए विशेष एनोटेशन नहीं है। आप सिर्फ एक @Beanप्रकार Filter(या FilterRegistrationBean) की घोषणा करते हैं । एक उदाहरण (सभी प्रतिक्रियाओं में एक कस्टम हेडर जोड़कर) बूट के अपने समापन बिंदु में है

यदि आप केवल घोषणा करते हैं तो Filterइसे सभी अनुरोधों पर लागू किया जाएगा। यदि आप भी जोड़ते हैं तो आप FilterRegistrationBeanव्यक्तिगत रूप से लागू करने के लिए अलग-अलग सर्वलेट और यूआरएल पैटर्न निर्दिष्ट कर सकते हैं।

ध्यान दें:

स्प्रिंग बूट 1.4 के रूप में, FilterRegistrationBeanपदावनत नहीं किया जाता है और बस से संकुल को स्थानांतरित किया org.springframework.boot.context.embedded.FilterRegistrationBeanजाता हैorg.springframework.boot.web.servlet.FilterRegistrationBean


क्या आप मुझे बताना चाहेंगे कि build.gradle में संबंधित प्रविष्टि कैसे शामिल करें? मैंने निम्नलिखित को जोड़ा, लेकिन यह संकलित नहीं हुआ: provideCompile ('javax.servlet: servlet-api: 2.5') रनटाइम ('javax.servlet: jstl: 1.1.2')
19

2
स्प्रिंग बूट सर्वलेट 2.5 के साथ काम नहीं करने वाला है, और जेएसपी के लिए वास्तव में बहुत समर्थन नहीं है। मैं वास्तव में एक ग्रेडर नहीं हूं, इसलिए मुझे नहीं पता कि आप क्या करने की कोशिश कर रहे हैं। "संकलन" में क्या गलत है? क्या यह काम करता है यदि आप बस "स्प्रिंग-बूट-स्टार्टर-वेब" पर निर्भर हैं? (मुझे नहीं लगता कि ये प्रश्न मूल प्रश्न से संबंधित हैं, इसलिए शायद आपको नए प्रश्नों के साथ फिर से पोस्ट करना चाहिए?)
डेव सीर

मैंने फ़िल्टर इंटरफ़ेस लागू करके एक फ़िल्टर जोड़ा, हालाँकि ग्रहण इंटरफ़ेस को खोजने में असमर्थ है। इसलिए मैं यह पता लगाने की कोशिश कर रहा हूं कि इसे संकलन के लिए क्लासपाथ में कैसे जोड़ा जाए।
जेंत्स्मिथ

1
हां, निश्चित रूप से आपको Filterअपने वर्गपथ पर होना चाहिए । आम तौर पर मैं बस spring-boot-starter-webसभी प्रासंगिक अवसाद (जैसे यहां ) में खींचने के लिए उपयोग करूंगा ।
डेव सीर

अन्य प्रतिक्रियाओं के विवरण के रूप में, आप केवल अपने फ़िल्टर वर्ग को @Component के साथ एनोटेट कर सकते हैं और यह स्वचालित रूप से पंजीकृत होगा (सभी URL के लिए)।
याकूब होली

72

आपके फ़िल्टर को जोड़ने के तीन तरीके हैं,

  1. स्प्रिंग स्टीरियोटाइप जैसे किसी एक के साथ अपने फ़िल्टर को एनोटेट करें @Component
  2. स्प्रिंग में टाइप के @Beanसाथ रजिस्टर करेंFilter@Configuration
  3. स्प्रिंग में टाइप के @Beanसाथ रजिस्टर करेंFilterRegistrationBean@Configuration

या तो # 1 या # 2 करेंगे यदि आप चाहते हैं कि आपका फ़िल्टर अनुकूलन के बिना सभी अनुरोधों पर लागू हो, तो # 3 का उपयोग करें अन्यथा। जब तक आप अपने फ़िल्टर वर्ग को उसी या उप-पैकेज में रखते हैं, तब तक काम करने के लिए आपको # 1 के लिए घटक स्कैन निर्दिष्ट करने की आवश्यकता नहीं हैSpringApplication । # 3 के लिए, # 2 के साथ उपयोग केवल तभी आवश्यक है जब आप स्प्रिंग को अपने फ़िल्टर वर्ग का प्रबंधन करना चाहते हैं जैसे कि यह ऑटो वायर्ड निर्भरता है। यह मेरे लिए मेरे फिल्टर को ठीक करने के लिए ठीक काम करता है, जिसे किसी भी निर्भरता ऑटोरिंग / इंजेक्शन की आवश्यकता नहीं है।

हालांकि # 2 और # 3 का संयोजन ठीक काम करता है, मुझे आश्चर्य था कि यह दो बार दो फिल्टर लगाने के साथ समाप्त नहीं होता है। मेरा अनुमान है कि स्प्रिंग दो फलियों को एक के रूप में जोड़ती है जब यह दोनों को बनाने के लिए एक ही विधि कहता है। मामले में आप # 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;
    }

बहुत बढ़िया जवाब। सभी विकल्पों का विवरण देने के लिए धन्यवाद और यह भी कि कैसे Filterउपयोग करते समय अपने ऑटो को कवर करने के लिए कवर करेंFilterRegistrationBean
sbk

बहुत बढ़िया जवाब। यह वही है जो मैंने मिटा दिया है !!
हयकार्ट

इसका वर्णन यहाँ भी किया गया है: baeldung.com/spring-boot-add-filter
Jakub Holý 2

31

अद्यतन: 2017-12-16:

स्प्रिंग बूट 1.5.8 में ऐसा करने के लिए 2 सरल तरीके हैं। कृपया, 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{
 ...
}

लेकिन आपको अपने @SpringBootApplication वर्ग में @ServletComponentScan एनोटेशन भी जोड़ना होगा:

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

ध्यान दें कि @Component स्प्रिंग का एनोटेशन है, लेकिन @WebFilter नहीं है। @WebFilter सर्वलेट 3 एनोटेशन है।

दोनों तरीके, आपको बस pom.xml में बेसिक स्प्रिंग बूट निर्भरता की आवश्यकता है (स्पष्ट टोमकेट एम्बेडेड जस्पर की कोई आवश्यकता नहीं)

    <?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>

चेतावनी: पहला तरीका, अगर स्प्रिंग बूट में नियंत्रक जेएसपी फ़ाइल में लौटता है, तो अनुरोध दो बार फ़िल्टर को पारित करेगा।

हालांकि, दूसरे तरीके में, अनुरोध केवल एक बार फ़िल्टर को पारित करेगा।

मैं दूसरा तरीका पसंद करता हूं क्योंकि यह सर्वलेट विनिर्देश में डिफ़ॉल्ट व्यवहार के समान है ( https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html )

आप यहां अधिक परीक्षण लॉग देख सकते हैं https://www.surasint.com/spring-boot-webfilter-instead-of-component/


मैंने देखा है कि Filterइंटरफ़ेस को कई बार ApplicationContext के लॉन्च के दौरान कहा जाता है। क्या इसे केवल एक बार निष्पादित करने का कोई तरीका है?
प्रातः

@PAA आप मेरे उदाहरण से मतलब है?
सुरसिन तन्खारोने

20

यहाँ मेरे कस्टम फ़िल्टर वर्ग का एक उदाहरण दिया गया है:

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);
    }
}

और मैंने इसे स्प्रिंग बूट विन्यास में विन्यास श्रेणी में जोड़कर निम्नानुसार जोड़ा:

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;
    }
}

14

स्प्रिंग डॉक्स से,

एंबेडेड सर्वलेट कंटेनर - एक आवेदन में एक सर्वलेट, फ़िल्टर या श्रोता जोड़ें

एक सर्वलेट, फ़िल्टर, या सर्वलेट जोड़ने के लिए * श्रोता इसके लिए एक @ परिभाषा प्रदान करते हैं ।

उदाहरण के लिए:

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

इस @Beanकॉन्फिग को अपनी @Configurationकक्षा में जोड़ें और फ़िल्टर स्टार्टअप पर पंजीकृत हो जाएगा।

इसके अलावा, आप क्लासपैथ स्कैनिंग का उपयोग करके सर्वलेट्स, फिल्टर और श्रोताओं को जोड़ सकते हैं,

@WebServlet, @WebFilter, और @WebListener एनोटेट वर्गों को स्वचालित रूप से एक एम्बेडेड सर्वलेट कंटेनर के साथ @Cervfiguration क्लास के साथ @ServletComponentScan और पैकेज को निर्दिष्ट करने के लिए पंजीकृत किया जा सकता है जिसमें आप पंजीकृत करना चाहते हैं। डिफ़ॉल्ट रूप से, @ServletComponentScan एनोटेट वर्ग के पैकेज से स्कैन करेगा।


docs.spring.io/spring-boot/docs/current/reference/html/… मेरे लिए काम नहीं किया लेकिन docs.spring.io/spring-boot/docs/1.5.8.RRASE/reference/html/… ने काम किया मेरे लिए।
user674669

7

यदि आप स्प्रिंग बूट + स्प्रिंग सुरक्षा का उपयोग करते हैं, तो आप सुरक्षा कॉन्फ़िगरेशन में कर सकते हैं।

नीचे दिए गए उदाहरण में, मैं UsernamePasswordAuthenticationFilter से पहले एक कस्टम फ़िल्टर जोड़ रहा हूं ( सभी डिफ़ॉल्ट स्प्रिंग सुरक्षा फ़िल्टर और उनके आदेश देखें )।

@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);
    }
}

5

@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

    }

}

3
इसके अलावा @ServletComponentScan
जस्टास

5

स्प्रिंग का उपयोग करके फ़िल्टर को पंजीकृत करने के लिए हमारे पास लगभग चार अलग-अलग विकल्प हैं ।

सबसे पहले, हम एक स्प्रिंग बीन लागू करने वाला फ़िल्टर बना सकते हैं या HttpFilter का विस्तार कर सकते हैं :

@Component
public class MyFilter extends HttpFilter {

    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) 
        throws IOException, ServletException {
        // Implementation details...

        chain.doFilter(request, response);
    }
}

दूसरी बात, हम जेनरिकफिल्टरबीन बनाने के लिए एक स्प्रिंग बीन बना सकते हैं :

@Component
public class MyFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
  throws IOException, ServletException {
    //Implementation details...

        chain.doFilter(currentRequest, servletResponse);
    }
}

वैकल्पिक रूप से हम FilterRegistrationBean वर्ग का उपयोग कर सकते हैं :

@Configuration
public class FilterConfiguration {

    private final MyFilter myFilter;

    @Autowired
    public FilterConfiguration(MyFilter myFilter) {
        this.myFilter = myFilter;
    }

    @Bean
    public FilterRegistrationBean<MyFilter> myFilterRegistration() {
        FilterRegistrationBean<DateLoggingFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(myFilter);
        filterRegistrationBean.setUrlPatterns(Collections.singletonList("/*"));
        filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST);
        filterRegistrationBean.setOrder(Ordered.LOWEST_PRECEDENCE - 1);
        return filterRegistrationBean;
    }
}

और अंत में हम @ServletComponentScan के साथ @WebFilter एनोटेशन का उपयोग कर सकते हैं :

@WebFilter(urlPatterns = "/*", dispatcherTypes = {DispatcherType.REQUEST})
public class MyFilter extends HttpFilter {

    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
  throws IOException, ServletException {
        // Implementation details...

        chain.doFilter(request, response);
    }
}

किस फ़िल्टर का उपयोग करना है और क्यों?
प्रातः

3

यह उत्तर की तुलना में अधिक सलाह है, लेकिन यदि आप अपने वेब एप्लिकेशन में स्प्रिंग एमवीसी का उपयोग कर रहे हैं तो फ़िल्टर के बजाय स्प्रिंग हैंडलरइंटरसेप्टर का उपयोग करना अच्छा है।

यह एक ही काम कर सकता है, लेकिन यह भी - ModelAndView के साथ काम कर सकता है - इसके तरीकों को अनुरोध प्रसंस्करण से पहले या बाद में, या अनुरोध पूरा होने के बाद कहा जा सकता है।
- इसे आसानी से टेस्ट किया जा सकता है

1 हैंडलरइंटरसेप्टर इंटरफ़ेस लागू करें और अपनी कक्षा में एक @ टिप्पणी जोड़ें

@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");
    }

}

सरल और सुरुचिपूर्ण! धन्यवाद
MrMins

3

यह फ़िल्टर आपको क्रॉस ओरिजिन एक्सेस की अनुमति देने में भी मदद करेगा

@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

    }

}

2

आप @WebFilter javax.servlet.annotation.WebFilter का उपयोग उस वर्ग पर कर सकते हैं जो javax.servlet.Filter लागू करता है

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

फिर रजिस्टर करने के लिए @ServletComponentScan का उपयोग करें


2

मैंने यहाँ बहुत सारे उत्तर देखे लेकिन मैंने उनमें से किसी को भी आज़माया नहीं। मैंने निम्नलिखित कोड के रूप में फ़िल्टर बनाया है।

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() {

    }
}

और शेष स्प्रिंग बूट एप्लीकेशन को भी वैसा ही बना दिया।


2

आपको 2 मुख्य चीज़ों की आवश्यकता है: - @ServletComponentScanअपने मुख्य वर्ग में जोड़ें - आप अपने अंदर फ़िल्टर नामक एक पैकेज जोड़ सकते हैं जिसे आप एक Filterवर्ग बनाते हैं जिसमें निम्नलिखित हैं:

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

 // whatever field you have

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
    HttpServletResponse response = (HttpServletResponse) res;
    HttpServletRequest request = (HttpServletRequest) req;

 // whatever implementation you want

        try {
            chain.doFilter(req, res);
        } catch(Exception e) {
            e.printStackTrace();
        }

}

public void init(FilterConfig filterConfig) {}

public void destroy() {}
}

1

आप @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();
        }   
    }

1

नाम के रूप में फ़िल्टर का उपयोग किसी संसाधन के अनुरोध पर या किसी संसाधन से प्रतिक्रिया, या दोनों पर फ़िल्टरिंग करने के लिए किया जाता है। स्प्रिंग बूट, स्प्रिंग बूट एप्लिकेशन में कस्टम फ़िल्टर को पंजीकृत करने के लिए कुछ विकल्प प्रदान करता है। आइए विभिन्न विकल्पों को देखें।

1. स्प्रिंग बूट फिल्टर और मंगलाचरण को परिभाषित करें

स्प्रिंग बूट में एक नया फ़िल्टर बनाने के लिए फ़िल्टर इंटरफ़ेस लागू करें।

@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
 }
}

आइए, उपरोक्त कोड में कुछ महत्वपूर्ण बिंदुओं को देखें

  • फ़िल्टर @Component एनोटेशन द्वारा पंजीकृत है ।
  • फिल्टर को सही क्रम में फायर करने के लिए- हमें @ ऑडर एनोटेशन का उपयोग करने की आवश्यकता है ।

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

उपरोक्त कोड में, CustomFirstFilter CustomSecondFilter से पहले चलेगा।

जितनी कम संख्या, उतनी ही उच्चता

2. URL पैटर्न

यदि कन्वेंशन-आधारित मैपिंग पर्याप्त रूप से लचीली नहीं है, तो हम एप्लिकेशन के पूर्ण नियंत्रण के लिए FilterRegistrationBean का उपयोग कर सकते हैं । यहां, फ़िल्टर वर्ग के लिए @Component एनोटेशन का उपयोग न करें, लेकिन 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() {

 }
}

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;
 }
}

1

    @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... ");
        }

    }

आपको फ़िल्टर लागू करने की आवश्यकता है और @WebFilter (urlPatterns = "/ *") के साथ एनोटेट करना होगा

और एप्लिकेशन या कॉन्फ़िगरेशन वर्ग में आपको @ServletComponentScan जोड़ना होगा, इसके द्वारा आपका फ़िल्टर पंजीकृत हो जाएगा।


यह @WebFilterकेवल सर्वलेट 3.0 के बाद से है। तो यह 2.5 के लिए ठीक से काम नहीं कर सकता है
ha9u63ar

1

चरण 1: फ़िल्टर इंटरफ़ेस लागू करके एक फ़िल्टर घटक बनाएं।

@Component
public class PerformanceFilter implements Filter {

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

            ......
            ......
    }

}

चरण 2: इस फ़िल्टर को फ़िल्टर पैटर्न का उपयोग करके uri पैटर्न में सेट करें।

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<PerformanceFilter> perfFilter() {
        FilterRegistrationBean<PerformanceFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new PerformanceFilter());
        registration.addUrlPatterns("/*");
        return registration;
    }
}

आप पूर्ण आवेदन के लिए इस लिंक का उल्लेख कर सकते हैं ।


0

सबसे पहले, @ServletComponentScanअपने SpringBootApplication वर्ग में जोड़ें ।

@ServletComponentScan
public class Application {

दूसरा, फ़िल्टर या तीसरे पक्ष के फ़िल्टर वर्ग का विस्तार करने वाली एक फ़िल्टर फ़ाइल बनाएँ और @WebFilterइस तरह इस फ़ाइल में जोड़ें :

@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{

0

मैंने @Vasily Komarov द्वारा उत्तर देखा। इसी तरह का दृष्टिकोण, लेकिन हैंडलरइंटरसेप्टर का उपयोग करने के बजाय अमूर्त हैंडलरइंटरसेप्टर एडेप्टर वर्ग का उपयोग करना

यहाँ एक उदाहरण है...

@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 );
    }

}

0

जैसा कि आप सभी जानते हैं, स्प्रिंग बूट न्यूनतम कॉन्फ़िगरेशन और राय वाले सेटअप के साथ वेबएप या स्टैंडअलोनऐप विकसित करने का एक शानदार तरीका है।

इस तरह मैंने स्प्रिंग बूट एप्लिकेशन में वेब फ़िल्टर डेवलपमेंट हासिल किया है

माई स्प्रिंगबूटऐप विनिर्देशों: -

स्प्रिंग बूट संस्करण: 2.0.4। कृपया
जावा संस्करण: 8.0
सर्वलेट विशिष्टता: सर्वलेट 3.0 (अनिवार्य और महत्वपूर्ण)

मैंने सर्वलेट विनिर्देशों 3.0 का पालन करते हुए, निम्नलिखित तरीके से अपना वेब फ़िल्टर घोषित किया

यहां छवि विवरण दर्ज करें यह Web.xml आधारित परिभाषाओं के प्रतिस्थापन के रूप में फ़िल्टर को परिभाषित करने का प्रोग्रामेटिक तरीका है।

"@Webfilter" एनोटेशन को तैनाती के दौरान कंटेनर द्वारा संसाधित किया जाएगा, फ़िल्टर वर्ग जिसमें यह पाया जाता है कॉन्फ़िगरेशन के अनुसार बनाया जाएगा और URL पैटर्न, javax.servlet.Servlets और javax.servlet.DispatcherTypes पर लागू किया जाएगा।

पूरी तरह से Web.xml से बचने के लिए और "भरोसेमंद" WebApp प्राप्त करने के लिए: -

स्प्रिंग बूट एप्लिकेशन को "पारंपरिक युद्ध" के रूप में तैनात करने के लिए, आवेदन वर्ग को स्प्रिंगबूटस्लेटलेट इंसुलेटर का विस्तार करना चाहिए।

ध्यान दें:: SpringBootServletInitializer Servlet 3.0+ विनिर्देशों के संदर्भ में web.xml का एक "प्रोग्रामेटिक कार्यान्वयन" है, जिसे WebApplicationInitializer के कार्यान्वयन की आवश्यकता होती है।

इस प्रकार,
SpringBootApplication को इसके अनुप्रयोग वर्ग के रूप में "web.xml" की आवश्यकता नहीं है (स्प्रिंगबूटस्लेटलेट इंसुलेटर के बाद) - @WebFilter के लिए स्कैन ,
- @WebListener और
- @WebServlet के ।

एनोटेशन @ServletComponentScan

यह एनोटेशन @WebFilter, @WebListener और @Webbervlet के साथ एनोटेट किए गए वेब घटकों के लिए आधार पैकेज को स्कैन करने में सक्षम बनाता है।

इस तथ्य के कारण कि एम्बेडेड कंटेनर @WebServlet, @WebFilter और @WebListener एनोटेशन का समर्थन नहीं करते हैं, स्प्रिंग बूट, एम्बेडेड कंटेनरों पर बहुत भरोसा करते हुए, इस नए एनोटेशन @ServletComponentScan को कुछ आश्रित जार का समर्थन करने के लिए पेश किया जो इन 3 एनोटेशन का उपयोग करते हैं।

स्कैन तभी किया जाता है जब एक एम्बेडेड सर्वलेट कंटेनर का उपयोग किया जाता है।

निम्नलिखित मेरी स्प्रिंग बूट एप्लीकेशन क्लास परिभाषा है: -

यहां छवि विवरण दर्ज करें

कस्टम सर्वलेट इनिशिएटिव:

यहाँ: मैंने एक कस्टम क्लास परिभाषित किया है: "सर्वलेट इंसुलेटर" जो कि क्लास को बढ़ाता है: स्प्रिंगबूटसर्वलेट इंसुलेटर।

जैसा कि पहले बताया गया है, स्प्रिंगबूटसर्वलेट
इंसुलेटर, एनोटेशन स्कैन करने के लिए जिम्मेदार है: - - @WebFilter,
- @WebListener और
- @WebServlet।

और इसलिए स्प्रिंग बूट एप्लीकेशन क्लास चाहिए

  • या तो वर्ग का विस्तार करें: SpringBootServletInitializer OR
  • कस्टम वर्ग का विस्तार करें जो वर्ग का विस्तार करता है: स्प्रिंगबूटसर्वलेट इंसुलेटर

यहां छवि विवरण दर्ज करें


-6

फ़िल्टर्स का उपयोग ज्यादातर लकड़हारा फाइलों में किया जाता है, यह आपके द्वारा परियोजना में उपयोग किए जाने वाले लकड़हारे के अनुसार भिन्न होता है। 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


FilterRegistrationBeanजैसा कि प्रश्न में उल्लेख किया गया है javax.servlet.Filter, इस उत्तर के बारे में बात करता हैorg.apache.logging.log4j.core.Filter
स्टीव बुज़ोनास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.