जैसा कि हम जानते हैं, जर्सी में हमारे पास प्री-मैचिंग फिल्टर और पोस्ट-मैचिंग फिल्टर होता है।

मैं सोच रहा हूं कि वेबफ्लक्स एप्लिकेशन में वेबफिल्टर के साथ मैं समान व्यवहार कैसे प्राप्त कर सकता हूं।

ऐसा लगता है कि वेबफिल्टर एक पूर्व-मिलान फ़िल्टर की तरह है जिसे निश्चित रूप से निष्पादित किया जाएगा, इससे कोई फर्क नहीं पड़ता कि @RestController में कोई संसाधन मिला या नहीं।

मेरा फ़िल्टर इस तरह (स्प्रिंग एक्ट्यूएटर में मेट्रिक्स फ़िल्टर से कॉपी किया गया):

@Component
@Order(100)
public class AppFilter1 implements WebFilter {

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

    return chain.filter(exchange).compose((call) -> filter(exchange, call));
}

private Publisher<Void> filter(ServerWebExchange exchange, Mono<Void> call) {

    System.out.println("Start AppFilter1 in thread:" + Thread.currentThread().getId() + "..........");
    ServerHttpResponse response = exchange.getResponse();
    return call.doOnSuccess((done) -> success(exchange)).doOnError((cause) -> {
        if (response.isCommitted()) {
            error(exchange, cause);
        } else {
            response.beforeCommit(() -> {
                error(exchange, cause);
                return Mono.empty();
            });
        }
    });
}

private void success(ServerWebExchange exchange) {

    System.out.println("End AppFilter1 in thread:" + Thread.currentThread().getId() + "..............");

}

private void error(ServerWebExchange exchange, Throwable cause) {
    System.out.println("End AppFilter1 with Error in thread:" + Thread.currentThread().getId() + "...............");
}

}

मेरा नियंत्रक जोड़ें इस प्रकार है:

@RestController
public class ExampleController {

@GetMapping("/example")
public String example() {
    System.out.println("Example in thread:" + Thread.currentThread().getId());
    return "Example";
}
}

मैं जो देख सकता हूं वह यह है कि फ़िल्टर को निश्चित रूप से निष्पादित किया जाएगा, चाहे मैं किसी भी एक्सेस / उदाहरण या / नोटेक्सिस्ट का उपयोग करूं

असल में मैं चाहता हूं कि मेरा फ़िल्टर पोस्ट-मिलान करे, केवल/उदाहरण के लिए निष्पादित किया जाए।

अधिक विशिष्ट होने के लिए, मैं/उदाहरण के लिए कंसोल आउटपुट देखना चाहता हूं:

Start AppFilter1 in thread:....
Example in thread:.....
End AppFilter1 in thread:....

और एक मेल न खाने वाले संसाधन जैसे /notexist के लिए, कोई कंसोल आउटपुट बिल्कुल नहीं है।

धन्यवाद

लियोन

1
anuni 28 मई 2018, 09:00

1 उत्तर

सबसे बढ़िया उत्तर

स्प्रिंग वेबफ्लक्स WebFilter क्लास जर्सी में प्री/पोस्ट मैचिंग फिल्टर के समान स्तर पर काम नहीं करता है। यह वास्तव में एक सर्वलेट फ़िल्टर के करीब है।

WebFilter को इस बारे में कोई जानकारी नहीं है कि अनुरोध को क्या हैंडल किया जा रहा है - यह एक नियंत्रक, स्थिर संसाधनों की सेवा करने वाला हैंडलर या कोई अन्य कस्टम हैंडलर हो सकता है।

चूंकि आप यहां HTTP स्तर पर हैं, आप केवल अनुरोध पथ की जांच कर सकते हैं और प्रतिक्रिया स्थिति "404 नहीं मिली" नहीं है।

चूंकि आपका प्रश्न इस बारे में अधिक पृष्ठभूमि प्रदान नहीं करता है कि आप यहां क्या हासिल करने की कोशिश कर रहे हैं (व्यावसायिक तर्क? प्रमाणीकरण? लॉगिंग? ट्रेसिंग? कोई भी ऑपरेशन जिसमें I/O शामिल है?), मैं वास्तव में रिएक्टर ऑपरेटर की पसंद के बारे में अधिक नहीं कह सकता .

यदि आप एक ऐसा फ़िल्टर चाहते हैं जो केवल संसाधनों पर काम करता हो (जैसा कि जर्सी संसाधनों में है), तो WebFilter सही विकल्प नहीं है क्योंकि यह निचले स्तर (सभी HTTP एक्सचेंज) पर काम कर रहा है। मुझे नहीं लगता कि स्प्रिंग फ्रेमवर्क में इसके लिए बुनियादी ढांचा है। स्प्रिंग फ्रेमवर्क में एक एन्हांसमेंट अनुरोध खोलने के लिए स्वतंत्र महसूस करें (इस बार आपके उपयोग के मामले के बारे में पर्याप्त विवरण प्रदान करना)।

0
Brian Clozel 29 मई 2018, 11:42