স্প্রিং বুটে ফিল্টার ক্লাস কীভাবে যুক্ত করবেন?


229

আমি ভাবছি, Filterস্প্রিং বুটে কোনও ক্লাসের (ওয়েব অ্যাপ্লিকেশনগুলির জন্য) কোনও টিকা আছে কিনা ? সম্ভবত @Filter?

আমি আমার প্রকল্পে একটি কাস্টম ফিল্টার যুক্ত করতে চাই।

স্প্রিং বুট রেফারেন্স গাইড সম্পর্কে উল্লেখ করা হয়েছে FilterRegistrationBeanতবে এটি কীভাবে ব্যবহার করবেন তা সম্পর্কে আমি নিশ্চিত নই।


দ্রষ্টব্য, যে ফিল্টারটি @ ওয়েবেফিল্টারের সাথে যুক্ত হয়েছে তা সার্লেট খ্যাতিতে প্রকৃত ফিল্টারটির মতো আচরণ করে না। এটি একটি বসন্ত মটরশুটি হবে যা প্রচুর অন্যান্য বসন্ত মটরশুটির পরে ডাকা হবে এবং কোনও সার্লেট কোডের আগে আসল ফিল্টারগুলির মতো নয়।
lrxw

আপনি আমাকে সঠিক প্রয়োজন বলতে পারেন আপনি যদি কম্পোনেন্টস্ক্যানের ফিল্টার ক্লাস করতে চান তবে তার জন্য একটি মন্তব্য আছে "@
কমপোনেন্টসস্ক্যান্ট ফিল্টার

উত্তর:


159

আপনি যদি কোনও তৃতীয় পক্ষের ফিল্টার সেটআপ করতে চান তবে আপনি ব্যবহার করতে পারেন FilterRegistrationBean। উদাহরণস্বরূপ ওয়েব.এক্সএমএল এর সমতুল্য

<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
আমি যদি একাধিক ফিল্টার যুক্ত করতে চাই? @ ওপাল
স্ট্রংজেও

8
কেবলমাত্র একটি অতিরিক্ত @ বিজন পাবলিক ফিল্টার নিবন্ধনবিয়ান অতিরিক্ত ফিল্টার নিবন্ধন ()
হাইম রমন

ফিল্টার প্রয়োগ করা হয় এমন আদেশটি কীভাবে কেউ জানতে পারে?
বীপডগ

7
ফিল্টার
হাইম রমন

আপনি someFilter()সরাসরি পদ্ধতিটি কল করার সময় আপনার ফিল্টার বিনের দরকার নেই ।
wst

117

একটি স্প্রিং বুট এমভিসি অ্যাপ্লিকেশনটিতে কাস্টম ফিল্টার অন্তর্ভুক্ত করার একটি পদ্ধতির উদাহরণ এখানে রয়েছে। কোনও উপাদান স্ক্যানে প্যাকেজটি অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন:

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 () কেবল 'সাধারণ' তে কাজ করে যা বসন্তের ধারক দ্বারা নয় by আমি মনে করি, কেউ ইনস () এর পরিবর্তে পোস্টকন্সট্রাক্ট ব্যবহার করতে পারে তবে আমি ফিল্টারটি স্প্রিং শিম হিসাবে ঘোষণা করতে অস্বীকার করায় এটি চেষ্টা করিনি।
বাউরজান

এই পদ্ধতি ব্যবহার করে ফিল্টার অর্ডার সম্পর্কে কী?
পাভেল ভ্লাসভ

আমরা কীভাবে সার্লেটলেসপোনস থেকে আরএস বডি পেতে পারি?
ব্যবহারকারী2602807

1
একটি গুরুত্বপূর্ণ বিষয় লক্ষণীয় হ'ল আপনার শিমের নাম (আপনার শ্রেণির নামের উপর ভিত্তি করে) স্প্রিং শিমের মতো হওয়া উচিত নয়। উদাহরণস্বরূপ, আপনি একটি তৈরি করার জন্য প্রলুব্ধ হতে পারেন MetricsFilter, তবে এই শিমটি একই নামের স্প্রিং অ্যাকুয়েটর শিমের দ্বারা ছড়িয়ে যাবে। এই কঠিন উপায়ে শিখেছি ...
কিনবিকো

78

কোনও সার্লেট ফিল্টার বোঝাতে একটি বিশেষ টিকা নেই। আপনি কেবল @Beanপ্রকারের Filter(বা FilterRegistrationBean) প্রকার ঘোষণা করেন । একটি উদাহরণ (সমস্ত প্রতিক্রিয়াতে কাস্টম শিরোনাম যুক্ত করা) বুটের নিজস্ব এন্ডপয়েন্ট ওয়েবেএমভিসিএআউটও কনফিগারেশনে রয়েছে ;

আপনি যদি কেবল একটি ঘোষণা করেন তবে Filterতা সমস্ত অনুরোধের জন্য প্রয়োগ করা হবে। আপনি যদি একটি যোগ করেন তবে FilterRegistrationBeanআপনি অতিরিক্তভাবে পৃথক সার্লেটগুলি এবং প্রয়োগ করতে url ধরণগুলিও নির্দিষ্ট করতে পারেন।

বিঃদ্রঃ:

স্প্রিং বুট ১.৪ হিসাবে, অবহিত করা FilterRegistrationBeanহয় না এবং কেবল প্যাকেজগুলি থেকে সরানো org.springframework.boot.context.embedded.FilterRegistrationBeanহয়org.springframework.boot.web.servlet.FilterRegistrationBean


আপনি বিল্ড.gradle এ সম্পর্কিত এন্ট্রি অন্তর্ভুক্ত কিভাবে আমাকে বলতে আপত্তি করবেন? আমি নিম্নলিখিতগুলি যুক্ত করেছি, তবে এটি সংকলিত হয় না: প্রদত্তকম্পাইল ('জাভ্যাক্স.সারলেট: সার্লেট-এপিআই: 2.5') রানটাইম ('জাভ্যাক্স.সারলেট: জেএসটিএল: 1.1.2')
জ্যানেটস্মিথ

2
স্প্রিং বুট সার্ভলেট 2.5 নিয়ে কাজ করবে না, এবং জেএসপির পক্ষে এখনও তেমন সমর্থন নেই। আমি আসলে গ্রেডার নই, তাই আপনি কী করতে চাইছেন তা আমি জানি না। "সংকলন" এর সাথে কী সমস্যা? আপনি যদি কেবল "স্প্রিং-বুট-স্টার্টার ওয়েব" এর উপর নির্ভর করেন তবে এটি কি কাজ করে? (আমি মনে করি না যে এই প্রশ্নগুলি মূল প্রশ্নের সাথে জড়িত, তাই সম্ভবত আপনার নতুন প্রশ্নগুলির সাথে আবার পোস্ট করা উচিত?)
ডেভ সায়ার

আমি ফিল্টার ইন্টারফেস প্রয়োগ করে একটি ফিল্টার যুক্ত করেছি, তবে Eclipse ইন্টারফেসটি খুঁজে পেতে অক্ষম। তাই আমি সংকলনের জন্য এটি ক্লাসপথে কীভাবে যুক্ত করব তা নির্ধারণ করার চেষ্টা করছি।
জ্যানেটস্মিথ

1
হ্যাঁ, অবশ্যই Filterআপনার ক্লাসপাথে থাকা দরকার। সাধারণত আমি কেবলমাত্র spring-boot-starter-webসমস্ত প্রাসঙ্গিক অবনতিগুলি (যেমন এখানে ) টানতে ব্যবহার করব ।
ডেভ সায়ার

অন্যান্য প্রতিক্রিয়াগুলির বিশদ হিসাবে, আপনি কেবলমাত্র @ কম্পোমেন্টের সাহায্যে আপনার ফিল্টার ক্লাসটি বর্ননা করতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে নিবন্ধিত হবে (সমস্ত URL- এর জন্য)।
জাকুব হলি

72

আপনার ফিল্টার যুক্ত করার জন্য তিনটি উপায় রয়েছে,

  1. একটি স্প্রিং স্টেরিওটাইপগুলি যেমন আপনার ফিল্টারকে টীকা দিন @Component
  2. বসন্তে টাইপ @Beanসহ একটি নিবন্ধন করুনFilter@Configuration
  3. বসন্তে টাইপ @Beanসহ একটি নিবন্ধন করুনFilterRegistrationBean@Configuration

হয় যদি আপনার ফিল্টারটি কাস্টমাইজেশন ছাড়াই সমস্ত অনুরোধে প্রযোজ্য হয় তবে # 1 বা # 2 করবেন অন্যথায় # 3 ব্যবহার করুন। আপনার ফিল্টার ক্লাসটি আপনার ক্লাসের একই বা উপ-প্যাকেজে যতক্ষণ রাখবেন ততক্ষণ আপনাকে # 1 এর জন্য উপাদান স্ক্যান নির্দিষ্ট করার দরকার নেই SpringApplication। # 3 এর জন্য, # 2 এর সাথে ব্যবহার কেবল তখনই প্রয়োজনীয় যখন আপনি বসন্তটি আপনার ফিল্টার শ্রেণি পরিচালনা করতে চান যেমন স্বয়ংক্রিয়ভাবে তারযুক্ত নির্ভরতা রয়েছে have আমার ফিল্টারটি নতুন করাতে এটি আমার পক্ষে ঠিক কাজ করে যার কোনও নির্ভরতা স্বাবলম্বীন / ইনজেকশন লাগবে না।

যদিও # 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

31

আপডেট: 2017-12-16:

স্প্রিং বুটে 1.5.8.8 এ করার জন্য দুটি সহজ উপায় রয়েছে RE

প্রথম উপায়: আপনার যদি কোনও প্রশস্ত URL প্যাটার্ন না থাকে তবে আপনি @ কম্পোনেন্টটি এটি ব্যবহার করতে পারেন: (সম্পূর্ণ কোড এবং বিশদটি এখানে https://www.surasint.com/spring-boot-filter/ )

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

দ্বিতীয় উপায়: আপনি যদি ইউআরএল নিদর্শনগুলি ব্যবহার করতে চান তবে আপনি @ ওয়েবেফিল্টারটি ব্যবহার করতে পারেন: (সম্পূর্ণ কোড এবং বিশদটি এখানে https://www.surasint.com/spring-boot-filter-urlpattern/ )

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

তবে আপনার নিজের @ স্প্রিংবুট অ্যাপ্লিকেশন ক্লাসে @ সার্ভলেট কম্পোনেন্টসস্ক্যান টীকা যুক্ত করতে হবে:

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

মনে রাখবেন যে @ কম্পোমেন্টটি হ'ল বসন্তের টিকা, তবে @ ওয়েবফিল্টার এটি নয়। @ ওয়েবফিল্টার হ'ল সার্লেট 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 ) ডিফল্ট আচরণের সাথে আরও অনুরূপ is

আপনি এখানে আরও পরীক্ষার লগ দেখতে পারেন https://www.surasint.com/spring-boot-webfilter-instead-of-comp घटक/


আমি Filterঅ্যাপ্লিকেশন কনটেক্সট প্রবর্তনের সময় ইন্টারফেসটি অসংখ্যবার কল করতে দেখেছি । এটি একবারে কার্যকর করার কোনও উপায় আছে কি?
প্র_এ

@ পিএএ আপনি আমার উদাহরণ থেকে বোঝাতে চান?
সুরসিন তানচরোয়েন

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ক্লাসে এই কনফিগারেশন যুক্ত করুন এবং ফিল্টার শুরুতে নিবন্ধিত হবে।

এছাড়াও আপনি ক্লাসপ্যাথ স্ক্যানিং ব্যবহার করে সার্লেটস, ফিল্টার এবং শ্রোতাদের যোগ করতে পারেন,

@ ওয়েবসার্লেট, @ ওয়েবেফিল্টার এবং @ ওয়েবেলিস্টার টীকাযুক্ত ক্লাসগুলি একটি এম্বেডড সার্লেট ধারক দিয়ে স্বয়ংক্রিয়ভাবে নিবন্ধভুক্ত হতে পারে @ সার্ভারকোম্পোনটিস্ক্যানের সাথে একটি @ কনফিগারেশন ক্লাসটি উল্লেখ করে এবং প্যাকেজ (গুলি) নির্দিষ্ট করে যেগুলি আপনি নিবন্ধ করতে চান। ডিফল্টরূপে, @ সার্লেটকোম্পোনস্ক্যান স্ক্রি টীকাগত শ্রেণীর প্যাকেজটি থেকে স্ক্যান করবে।



7

আপনি যদি স্প্রিং বুট + স্প্রিং সিকিউরিটি ব্যবহার করেন তবে আপনি সুরক্ষা কনফিগারেশনে এটি করতে পারেন।

নীচের উদাহরণে, আমি ব্যবহারকারীর নাম পাসওয়ার্ডআউটেন্টিকেশন ফিল্টার ( সমস্ত ডিফল্ট স্প্রিং সুরক্ষা ফিল্টার এবং তাদের ক্রম দেখুন ) এর আগে একটি কাস্টম ফিল্টার যুক্ত করছি ।

@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(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
এছাড়াও @ সার্ভালেট কম্পোনেন্টস্ক্যান যুক্ত করুন
জাস্টাস

5

স্প্রিং ব্যবহার করে ফিল্টার নিবন্ধ করার জন্য আমাদের কাছে মোটামুটি চারটি ভিন্ন বিকল্প রয়েছে ।

প্রথমত, আমরা একটি স্প্রিং শিম ফিল্টার প্রয়োগ করতে বা এইচটিটিপিফিল্টার প্রসারিত করতে পারি :

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

বিকল্পভাবে আমরা ফিল্টার - নিবন্ধনবিয়ান শ্রেণিটি ব্যবহার করতে পারি :

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

এবং সবশেষে আমরা @ সার্ভেলকম্পোনটিস্ক্যানের সাহায্যে @ ওয়েবফিল্টার টীকাটি ব্যবহার করতে পারি :

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

কোন ফিল্টার ব্যবহার করতে হবে এবং কেন?
Pra_A

3

উত্তরের চেয়ে এটি আরও পরামর্শ, তবে আপনি যদি নিজের ওয়েব অ্যাপ্লিকেশনটিতে একটি স্প্রিং এমভিসি ব্যবহার করেন তবে ফিল্টারের পরিবর্তে স্প্রিং হ্যান্ডলারআইন্টারটার ব্যবহার করা ভাল ধারণা

এটি একই কাজটি করতে পারে, তবে - মডেলএন্ডভিউয়ের সাথেও কাজ করতে পারে - এর পদ্ধতিগুলি অনুরোধ প্রক্রিয়া করার আগে এবং পরে, বা অনুরোধ সমাপ্তির পরে ডাকা যেতে পারে।
- এটি সহজে পরীক্ষা করা যায়

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

}

সরল ও মার্জিত! ধন্যবাদ
মিঃমিন্স

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

Javax.servlet.Filter প্রয়োগ করে এমন একটি ক্লাসে আপনি @WebFilter javax.servlet.annotation.WebFilter ব্যবহার করতে পারেন

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

তারপরে নিবন্ধন করতে @ সার্ভলেটকম্পোনটিস্ক্যান ব্যবহার করুন


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

আপনার দুটি প্রধান জিনিস প্রয়োজন: - @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

আপনি @ ওয়েবেফিল্টার এবং ফিল্টার প্রয়োগ করে একটি ফিল্টার তৈরি করতে পারেন, এটি করবে।

 @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
    @Order(1)
    public class CustomFirstFilter implements Filter {
    
    }
    @Component
    @Order(2)
    public class CustomSecondFilter implements Filter {
    
    }

উপরের কোডে কাস্টমফার্সফিল্টার কাস্টমসেকন্ডফিল্টারের আগে চলবে।

সংখ্যাটি যত কম, তত বেশি প্রাধান্য

2. ইউআরএল প্যাটার্ন

যদি কনভেনশন-ভিত্তিক ম্যাপিং যথেষ্ট নমনীয় না হয় তবে আমরা অ্যাপ্লিকেশনটির সম্পূর্ণ নিয়ন্ত্রণের জন্য ফিল্টার-রেজিস্ট্রেশনবিয়ান ব্যবহার করতে পারি । এখানে, ফিল্টার শ্রেণীর জন্য @ অংশীকরণ টীকাটি ব্যবহার করবেন না তবে ফিল্টাররেগেশনবিয়ান ব্যবহার করে ফিল্টারটি নিবন্ধ করুন

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

 }
}

ফিল্টাররেগেশনবিয়ান ব্যবহার করে কাস্টম ফিল্টারটি নিবন্ধ করুন

@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 = "/ *") দিয়ে এ্যানোটেট করা দরকার

এবং অ্যাপ্লিকেশন বা কনফিগারেশন শ্রেণিতে আপনাকে @ সার্ভালেট কম্পোনেন্টসস্ক্যান যুক্ত করতে হবে এটির মাধ্যমে আপনার ফিল্টারটি নিবন্ধিত হবে।


এটি @WebFilterকেবলমাত্র সার্লেট ৩.০ থেকে। সুতরাং এটি 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: ফিল্টাররেগেশনবিয়ান ব্যবহার করে এই ফিল্টারটি ইউরি প্যাটার্নে সেট করুন।

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

সম্পূর্ণ আবেদনের জন্য আপনি এই লিঙ্কটি উল্লেখ করতে পারেন ।


0

প্রথমে @ServletComponentScanআপনার স্প্রিংবুট অ্যাপ্লিকেশন ক্লাসে যুক্ত করুন।

@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

আমি উত্তরটি ভ্যাসিলি কমারভের দ্বারা দেখেছি। একই পদ্ধতির কিন্তু বিমূর্ত ব্যবহার HandlerInterceptorAdapter পরিবর্তে বর্গ ব্যবহার HandlerInterceptor

এখানে একটি উদাহরণ ...

@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

আপনারা সবাই জানেন যে, স্প্রিং বুট একটি ওয়েব অ্যাপ্লিকেশন বা ন্যূনতম কনফিগারেশন এবং মতামত সেটআপ সহ স্ট্যান্ডঅ্যালোন অ্যাপ বিকাশের একটি দুর্দান্ত উপায়।

এভাবেই আমি স্প্রিং বুট অ্যাপ্লিকেশনটিতে একটি ওয়েব ফিল্টার বিকাশ অর্জন করেছি

আমার স্প্রিংবুট অ্যাপ স্পেসিফিকেশন: -

স্প্রিং বুট সংস্করণ: ২.০.৪.আরলেস
জাভা সংস্করণ: ৮.০ সার্লেট
নির্দিষ্টকরণ: সার্ভলেট 3.0 (বাধ্যতামূলক এবং গুরুত্বপূর্ণ)

আমি সার্ভলেট স্পেসিফিকেশন 3.0.০ অনুসরণ করে নিম্নলিখিত পদ্ধতিতে আমার ওয়েব ফিল্টারটি ঘোষণা করেছিলাম

এখানে চিত্র বর্ণনা লিখুন ওয়েব.এক্সএমএল ভিত্তিক সংজ্ঞাগুলির প্রতিস্থাপন হিসাবে ফিল্টারকে সংজ্ঞায়িত করার এটি প্রোগ্রামিক পদ্ধতি।

"@ ওয়েবেফিল্টার" টীকাগুলি মোতায়েনের সময় কনটেইনার দ্বারা প্রক্রিয়া করা হবে, ফিল্টার শ্রেণীর মধ্যে এটি পাওয়া যায় যেটি কনফিগারেশন অনুযায়ী তৈরি করা হবে এবং ইউআরএল নিদর্শন, জাভ্যাক্স.সারলেট.সার্ভলেট এবং জাভ্যাক্স.সারলেট.ডিসপাচারটাইপগুলিতে প্রয়োগ করা হবে।

Web.xML সম্পূর্ণরূপে এড়াতে এবং "প্রয়োগযোগ্য" ওয়েব অ্যাপ্লিকেশন অর্জন করতে: -

"ট্র্যাডিশনাল ওয়ার" হিসাবে স্প্রিং বুট অ্যাপ্লিকেশন স্থাপন করার জন্য, অ্যাপ্লিকেশন শ্রেণির স্প্রিংবুটসার্ভালেটআইনিটাইজারকে বাড়ানো উচিত।

দ্রষ্টব্য :: স্প্রিংবুটসার্ভলেটআইনিটিয়ালাইজার হ'ল সার্ভলেট 3.0.০+ স্পেসিফিকেশন সম্পর্কিত রেফারেন্স সহ ওয়েব.এক্সএমএল এর একটি "প্রোগ্রাম্যাটিক ইমপ্লিমেন্টেশন", যার জন্য ওয়েব অ্যাপ্লিকেশন ইনিটিয়ালাইজারের প্রয়োগ প্রয়োজন।

সুতরাং, স্প্রিংবুট অ্যাপ্লিকেশনটির জন্য "ওয়েব.এক্সএমএল" এর অ্যাপ্লিকেশন ক্লাস হিসাবে প্রয়োজন নেই (স্প্রিংবুটসার্ভাটিলিটাইজারটি প্রসারিত করার পরে)
- @ ওয়েবেফিল্টার,
- @ ওয়েবেলিস্টনার এবং
- @ ওয়েবে সার্ভালেট।

টীকাগুলি

এই টিকাটি @ ওয়েবফিল্টার, @ ওয়েললিস্টনার এবং @ ওয়েবসার্ভলেটের সাহায্যে উল্লিখিত ওয়েব উপাদানগুলির জন্য স্ক্যানিং বেস প্যাকেজগুলিকে সক্ষম করে।

এম্বেড থাকা পাত্রে @WebServlet, @WebFilter এবং @ ওয়েবেলিস্টার টিকাগুলি সমর্থন করে না এই কারণে, স্প্রিং বুট, এম্বেডড পাত্রে প্রচুর পরিমাণে নির্ভর করে, এই 3 টি টিকা ব্যবহার করে এমন কিছু নির্ভরশীল জারগুলিকে সমর্থন করার জন্য এই নতুন টিকাটি @ সার্লেটকম্পোনস্ক্যান স্ক্যান চালু করেছে।

এম্বেড করা সার্লেট কন্টেইনার ব্যবহার করার সময় স্ক্যান করা হয়।

নিম্নলিখিতটি আমার স্প্রিং বুট অ্যাপ্লিকেশন শ্রেণির সংজ্ঞা:

এখানে চিত্র বর্ণনা লিখুন

কাস্টম সার্লেট আরম্ভকারী:

এখানে: আমি একটি কাস্টম ক্লাসটি সংজ্ঞায়িত করেছি: "সার্ভলেটআইনিটিয়ালাইজার" যা শ্রেণি: স্প্রিংবুটসার্ভলেটআইনিটাইজারকে প্রসারিত করে।

যেমনটি আগে ব্যাখ্যা করা হয়েছে, স্প্রিংবুটসার্ভিলিটালাইজারটি টীকাগুলি স্ক্যান করার জন্য দায়ী: -
- @ ওয়েবেফিল্টার,
- @ ওয়েলব্লাইস্টার এবং
- @ ওয়েবে সার্ভলেট।

এবং তাই স্প্রিং বুট অ্যাপ্লিকেশন ক্লাস করা উচিত

  • হয় শ্রেণি প্রসারিত করুন: স্প্রিংবুটসার্ভলেটআইনিটাইজার বা
  • শ্রেণীর প্রসারিত কাস্টম শ্রেণীর প্রসারিত করুন: স্প্রিংবুটসার্ভালেটআইনিটাইজার

এখানে চিত্র বর্ণনা লিখুন


-6

ফিল্টারগুলি বেশিরভাগ লগার ফাইলগুলিতে ব্যবহৃত হয় এটি আপনি লগমে প্রকল্পের লগমে লগ 4j2 এর জন্য ব্যাখ্যা করে এমন লগার অনুসারে পরিবর্তিত হয়:

<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 - লগ 4 জ লেভেলের স্তর ক্রমটি দেখুন: সমস্ত> ট্র্যাক> ডিবাগ> তথ্য> সতর্কতা> ত্রুটি> ফ্যাটাল> অফ


FilterRegistrationBeanপ্রশ্নে উল্লিখিত হিসাবে javax.servlet.Filter, এই উত্তরটি সম্পর্কে কথা বলা হয়org.apache.logging.log4j.core.Filter
স্টিভ বুজনস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.