स्प्रिंग बूट: ओवरविकाइडिंग फ़ेविकॉन


84

मैं स्प्रिंग बूट के फेविकॉन को कैसे ओवरराइड कर सकता हूं?

नोट : यहां मेरा एक और प्रश्न है जो एक और समाधान प्रदान करता है जिसमें कोई कोडिंग शामिल नहीं है: स्प्रिंग बूट: क्या एक मोटी जार के साथ बाहरी एप्लिकेशन का उपयोग करना संभव है। यह application.properties के लिए है, लेकिन इसे फेविकॉन पर भी लागू किया जा सकता है। वास्तव में, मैं फ़ेविकॉन ओवरराइडिंग के लिए उस पद्धति का उपयोग कर रहा हूं।

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

अन्यथा, WebMvcAutoConfiguration रजिस्टरों faviconRequestHandler बीन, (देखें स्रोत https://github.com/spring-projects/spring-boot/blob/master/sing-boot-autoconfigure/src/main/java/org/springframework) web / WebMvcAutoConfiguration.java ) और यह 'ग्रीन लीफ' आइकन की सेवा करता है जिसे स्प्रिंग बूट के मुख्य संसाधन निर्देशिका में रखा गया है।

मैं उस वर्ग को लागू किए बिना इसे कैसे ओवरराइड कर सकता हूं, जिसमें खुद @EnableWebMvc है, इस प्रकार स्प्रिंग बूट के WebMvcAutoConfiguration वर्ग की संपूर्ण डिफ़ॉल्ट कॉन्फ़िगरेशन कार्यक्षमता को अक्षम करना?

इसके अलावा, जब से मैं चाहता हूं कि आइकन फ़ाइल को क्लाइंट (वेब ​​ब्राउज़र) की तरफ से जल्द से जल्द अपडेट किया जाए, मैं फ़ेविकॉन फ़ाइल की कैश अवधि को 0. पर सेट करना चाहता हूं (निम्न कोड की तरह, जिसे मैं अपने लिए उपयोग कर रहा हूं 'स्टैटिक' वेबएप्प कंटेंट और स्क्रिप्ट फाइल्स, जिन्हें फाइल बदलने के बाद क्लाइंट साइड पर जल्द से जल्द अपडेट किया जाना चाहिए।)

public void addResourceHandlers(ResourceHandlerRegistry registry)
{
    registry.addResourceHandler("/**")
        .addResourceLocations("/")
        .setCachePeriod(0);
}

तो, बस favicon.ico फ़ाइल को सहेजने की जगह खोजने के लिए कि स्प्रिंग बूट का faviconRequestHandler सम्मान पर्याप्त नहीं हो सकता है।

अपडेट करें

अब मुझे पता है कि मैं एक favicon फ़ाइल को src / main / resource निर्देशिका में रखकर डिफ़ॉल्ट को ओवरराइड कर सकता हूँ। लेकिन कैश अवधि की समस्या अभी भी बनी हुई है।
इसके अलावा, फ़ेविकॉन फ़ाइल को उस निर्देशिका में रखना बेहतर होता है जो स्थिर वेब फ़ाइलों को रखा जाता है, बजाय संसाधन निर्देशिका के।

अपडेट करें

ठीक है, मैं डिफ़ॉल्ट को ओवरराइड करने में कामयाब रहा। मैंने जो किया वह इस प्रकार है:

@Configuration
public class WebMvcConfiguration
{
    @Bean
    public WebMvcConfigurerAdapter faviconWebMvcConfiguration()
    {
        return new FaviconWebMvcConfiguration();
    }

    public class FaviconWebMvcConfiguration extends WebMvcConfigurerAdapter
    {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry)
        {
            registry.setOrder(Integer.MIN_VALUE);
            registry.addResourceHandler("/favicon.ico")
                .addResourceLocations("/")
                .setCachePeriod(0);
        }
    }
}

मूल रूप से, मैं एक संसाधन हैंडलर को उच्चतम क्रम के साथ रजिस्ट्री.सेटऑर्डर (Integer.MIN_VALUE) कहकर डिफ़ॉल्ट रूप से ओवररोड करता हूं।

चूंकि स्प्रिंग बूट में डिफ़ॉल्ट एक का ऑर्डर मूल्य (Integer.MIN_VALUE + 1) है, ( https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/ में FaviconConfiguration क्लास देखें) src / main / java / org / springframework / boot / autoconfigure / web / WebMvcAutoConfiguration.java ) मेरा हैंडलर जीतता है।

यह ठीक है? क्या कोई और तरीका है (जैसा मैंने किया था, उससे कुछ ज्यादा ही अच्छा है)?

अपडेट करें

यह ठीक नहीं है। जब मैं फोन करता हूं registry.setOrder(Integer.MIN_VALUE), वास्तव में मैं सभी संसाधन हैंडलर की प्राथमिकता बढ़ाता हूं। इसलिए, जब मैं निम्नलिखित कोड को दूसरे में जोड़ता हूं, तो WebMvcConfigurerAdapterप्रभावी रूप से सभी http अनुरोध उस संसाधन हैंडलर को निर्देशित किया जाता है, जो जावा कोड द्वारा किसी भी गतिशील हैंडलिंग को रोकता है।

public void addResourceHandlers(ResourceHandlerRegistry registry)
{
    registry.addResourceHandler("/**")
        .addResourceLocations("/")
        .setCachePeriod(0);
}

एक और उपाय की जरूरत है।

अपडेट करें

अभी के लिए, मुझे फ़ेविकॉन फ़ंक्शनलिटी को ओवरराइड करने का तरीका नहीं मिला जो स्प्रिंग बूट प्रदान करता है।
हो सकता है कि मेरा खुद का HandlerMappingबीन जोड़ने का कोई तरीका हो , लेकिन मुझे नहीं पता कि यह कैसे करना है।

अब मैं निम्नलिखित विकल्पों में से एक चुन सकता हूं:

  1. एक वर्ग है जो @EnableWebMvcइस प्रकार स्प्रिंग बूट WebMvcAutoConfigurationवर्ग को अक्षम कर रहा है । (मैं WebMvcAutoConfigurationकक्षा के कोड की प्रतिलिपि बना सकता हूं और फ़ेविकॉन कार्यक्षमता को हटा सकता हूं )
  2. फ़ेविकॉन फ़ाइल को मध्यस्थ स्थान पर रखने की स्वतंत्रता दें और इसे रिसोर्स डायरेक्टरी में रखें क्योंकि स्प्रिंग बूट की फ़ेविकॉन फ़ंक्शनलिटी की आवश्यकता होती है। और कैशिंग समस्या की उपेक्षा करें।

लेकिन न तो विकल्प संतोषजनक है।
मैं अपनी स्थिर वेब फ़ाइलों के साथ फ़ेविकॉन फ़ाइल रखना चाहता हूं (जो किसी भी निर्देशिका हो सकती है क्योंकि मैं दस्तावेज़ रूट को बदल सकता हूं) और कैशिंग समस्या को हल कर सकता हूं।
क्या मैं कुछ भूल रहा हूँ?
किसी भी सुझाव बहुत सराहना की जाएगी।

अपडेट करें

BTW, इस कारण मैं फ़ेविकॉन और अन्य स्थिर फ़ाइलों के स्थान को बदलना चाहता हूं। अभी के लिए यह मुख्य रूप से विकास का पर्यावरण मुद्दा है।

मैं एक सिंगल पेज वेब एप्लिकेशन (एसपीए) बना रहा हूं।

पुस्तकालय / फ़्रेमवर्क:

  • सर्वर साइड के लिए, मैं स्प्रिंग का उपयोग करता हूं। (बेशक)
  • क्लाइंट (वेब ​​ब्राउज़र) पक्ष के लिए, मैं AngularJS का उपयोग करता हूं।

उपकरण:

  • सर्वर साइड के लिए, मैं स्प्रिंग टूल सूट का उपयोग करता हूं।
  • क्लाइंट साइड के लिए, मैं WebStorm का उपयोग करता हूं।

मुख्य निर्देशिका संरचना:

ProjectRoot\
    src\
    bin\
    build\
    webapp\
    build.gradle
  • src: जहाँ मेरा स्प्रिंग जावा सोर्स फाइल रहता है।
  • बिन: जहां स्प्रिंग टूल सूट इसका निर्माण आउटपुट देता है।
  • बिल्ड: जहां 'ग्रेडल बिल्ड' अपने बिल्ड आउटपुट को रखता है।
  • webapp: जहाँ मेरे क्लाइंट सोर्स फाइल्स (.js, .css, .htm और favicon) रहते हैं। इस प्रकार यह WebStorm प्रोजेक्ट डायरेक्टरी है। (यदि आवश्यक हो तो मैं निर्देशिका का नाम बदल सकता हूं)

मुझे क्या चाहिए:

  • मेरे स्प्रिंग सर्वर एप्लिकेशन को पुनः बनाने / पुनः आरंभ किए बिना मेरे क्लाइंट कोड को संशोधित करने और परीक्षण करने में सक्षम होने के लिए। तो, क्लाइंट कोड को जार फ़ाइल में नहीं डाला जाना चाहिए। वैसे भी स्प्रिंग टूल सूट में जार फ़ाइल बिलकुल नहीं बनती है (कम से कम वर्तमान कॉन्फ़िगरेशन के लिए)
  • क्लाइंट कोड के साथ मेरे स्प्रिंग सर्वर एप्लिकेशन का परीक्षण करने में सक्षम होने के लिए, आसानी से स्प्रिंग टूल सूट आउटपुट और ग्रेडल आउटपुट के बीच स्विच करना। इसलिए, क्लाइंट कोड को buildउपनिर्देशिका (वास्तव में build\libs) में सर्वर एप्लिकेशन और binनिर्देशिका में सर्वर एप्लिकेशन दोनों से सुलभ होना चाहिए ।
  • जब मैं क्लाइंट कोड को संशोधित करता हूं, तो यह तुरंत वेब ब्राउज़र के लिए उपलब्ध होना चाहिए। इसलिए ब्राउज़र को इसे अनिश्चित काल तक कैश नहीं करना चाहिए, और हमेशा अपडेट के लिए सर्वर से पूछना चाहिए।
  • जब तैनात किया जाता है, तो क्लाइंट कोड सर्वर एप्लिकेशन के पुनर्निर्माण / पुनः आरंभ किए बिना संशोधित होना चाहिए। तो क्लाइंट कोड को जार फ़ाइल में नहीं डाला जाना चाहिए।

कैश समस्या के बारे में:

AddResourceHandlers () पर setCachePeriod (0) के बिना, Google Chrome अपडेट के लिए सर्वर से पूछे बिना, फ़ाइल को अनिश्चित काल तक कैश करता है। यह सर्वर से कनेक्ट भी नहीं होता है। (Google इंजीनियरों का कहना है कि व्यवहार सही है।) इसलिए, मैं केवल इतना कर सकता हूं कि ब्राउज़र कैश को मैन्युअल रूप से साफ़ करें। यह विकास पर्यावरण पर निराशाजनक है, और उत्पादन पर्यावरण पर अस्वीकार्य है।

BTW, express.js मॉड्यूल Node.js पर उचित डिफ़ॉल्ट HTTP हेडर देता है ताकि Google Chrome सर्वर से अपडेट के लिए पूछ सके। जब मैंने HTTP हेडर की समीक्षा की थी कि स्प्रिंग और एक्सप्रेस.जेड फ़िडलर का उपयोग करके उत्पादन करते हैं, तो वे अलग थे।

मेरे पर्यावरण में सुधार के लिए किसी भी सुझाव की सराहना की जाएगी।
जब से मैं एक स्प्रिंग शुरुआत कर रहा हूं, मुझे कुछ याद आ रहा है।

अपडेट करें

अंत में मेरा एक काम कोड है। यह इस प्रकार है:

@Configuration
public static class FaviconConfiguration
{
    @Bean
    public SimpleUrlHandlerMapping myFaviconHandlerMapping()
    {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setOrder(Integer.MIN_VALUE);
        mapping.setUrlMap(Collections.singletonMap("/favicon.ico",
            myFaviconRequestHandler()));
        return mapping;
    }

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    protected ResourceHttpRequestHandler myFaviconRequestHandler()
    {
        ResourceHttpRequestHandler requestHandler =
            new ResourceHttpRequestHandler();
        requestHandler.setLocations(Arrays
            .<Resource> asList(applicationContext.getResource("/")));
        requestHandler.setCacheSeconds(0);
        return requestHandler;
    }
}

बीन नामों पर ध्यान दें। मैंने नाम क्लैश से बचने के लिए 'माय' जोड़ा है।
स्वतः-भरण अनुप्रयोग संदर्भ स्वयं ही अटपटा लगता है, लेकिन इसमें कोड की नकल करने के लिए यह आवश्यक था org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration.addResourceLocations()

अब मेरे पास कैवलिंग समस्या से मुक्त एक फ़ेविकॉन हैंडलर है, और मैं फ़ेविकॉन फ़ाइल को कहीं भी रख सकता हूँ।
धन्यवाद।


1
आपका तरीका ठीक लग रहा है। क्या यह डिफ़ॉल्ट स्प्रिंग MVC संसाधन हैंडलर को प्रतिस्थापित नहीं करता है (हालांकि स्थिर संसाधनों को classpath:/staticउदाहरण के लिए किसी भी और से नहीं दिया जाएगा )। (यही कारण है कि बूट में फ़ेविकॉन समर्थन अपने स्वयं के हैंडलर में है जो मुझे लगता है।)
डेव

@DaveSyer अब मुझे एहसास हुआ कि यह ठीक नहीं है। मैंने ऊपर तीसरा अपडेट लिखा। शायद अलग करने HandlerMappingकी जरूरत है।
१३:३५

@DaveSyer कृपया मेरा चौथा अपडेट ऊपर देखें। क्या कोई और तरीका है? उदाहरण के लिए, क्या मैं अपना पंजीकरण करा सकता हूं HandlerMapping?
zeodtr

हां, आप एक जोड़ सकते हैं HandlerMapping(बस बूट से एक कॉपी करें और इसे एक उच्च प्राथमिकता दें)। मुझे वास्तव में यकीन नहीं है कि आप इसके स्थान की परवाह क्यों करेंगे favicon.ico fileलेकिन अगर आप चाहें तो हम इसे कॉन्फ़िगर करने योग्य बना सकते हैं। सभी ब्राउज़र इसे कैश भी करेंगे, इसलिए मुझे कैश सेटिंग्स की बात पर संदेह है, लेकिन गलत साबित होने पर खुशी होगी।
डेव सीर

@DaveSyer कृपया इस कारण के लिए अद्यतन प्रश्न देखें कि मैं स्थिर फ़ाइलों को अलग-अलग स्थान पर क्यों रखना चाहता हूं। इसके अलावा कैश मुद्दा।
zeodtr

जवाबों:


54

आप बस अपने स्वयं के favicon.ico को classpath की जड़ में या किसी भी स्थिर संसाधन स्थानों (जैसे classpath:/static) में रख सकते हैं । आप एकल ध्वज के साथ फ़ेविकॉन रिज़ॉल्यूशन को पूरी तरह से अक्षम कर सकते हैं spring.mvc.favicon.enabled=false

या पूर्ण नियंत्रण लेने के लिए आप एक हैंडलर मैपिंग जोड़ सकते हैं (बस बूट से एक कॉपी करें और इसे एक उच्च प्राथमिकता दें), उदाहरण के लिए

@Configuration
public static class FaviconConfiguration {

@Bean
public SimpleUrlHandlerMapping faviconHandlerMapping() {
    SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
    mapping.setOrder(Integer.MIN_VALUE);
    mapping.setUrlMap(Collections.singletonMap("mylocation/favicon.ico",
            faviconRequestHandler()));
    return mapping;
}

@Bean
protected ResourceHttpRequestHandler faviconRequestHandler() {
    ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
    requestHandler.setLocations(Arrays
            .<Resource> asList(new ClassPathResource("/")));
    return requestHandler;
}
}

धन्यवाद। मुझे लगा कि मैंने पहले ही इसे आज़मा लिया है, लेकिन अब मुझे लगता है कि मैं @Configurationएनोटेशन से चूक गया । BTW, मैंने कारण लिखा है कि मैं प्रश्न पर विभिन्न स्थानों में स्थिर फाइलें क्यों रखना चाहता हूं।
zeodtr

BTW, क्योंकि मुझे दस्तावेज़ रूट (दाएं?) में एक फ़ाइल प्राप्त करने के लिए ResourceLoader.gerResource ("/") का उपयोग करना चाहिए, मुझे @Autowire ApplicationContext चाहिए। क्या यह अनुप्रयोग के संदर्भ में DI से ठीक है? कुछ कहते हैं कि यह बुरी बात है।
जियोड्रैट

मैं आपके सुझाव की कोशिश कर रहा हूं। एक बात ध्यान दें: मेरा बीन नाम 'faviconHandlerMapping' नहीं होना चाहिए, क्योंकि यह स्प्रिंग बूट के faviconHandlerMapping बीन के साथ सेम नाम टकराव का कारण बनता है। केवल 2 सेम में से एक का चयन एक विधि द्वारा किया जाएगा जिसे org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestor s () द्वारा बुलाया जाता है जिसे फिर से org.springframework.web.servlet.initHandlerMappings द्वारा बुलाया जाता है। ऐसा लगता है कि मेरा बीन पहले क्लैश से भरा हुआ है और नाम से टकराया है।
२०:१३

पंजीकृत HandlerMapping सेम के नाम इस प्रकार हैं: { faviconHandlerMapping, requestMappingHandlerMapping, viewControllerHandlerMapping, beanNameHandlerMapping, resourceHandlerMapping, defaultServletHandlerMapping, endpointHandlerMapping} तो मैं उन नामों से बचना चाहिए।
२०:१३

2
आपको अपडेट किए गए उत्तर को पढ़ना चाहिए, और उपयोगकर्ता गाइड को भी। यदि आप सब करना चाहते हैं आइकन बदल रहा है यह एक बहुत ही मुश्किल बदलाव कभी नहीं था। मुझे नहीं पता कि ओपी इतनी परेशानी में क्यों गया।
डेव सीर

75

इसमें से कोई भी मेरे लिए जरूरी नहीं था।

जब आप उत्पन्न JAR के साथ एक संसाधन को बंडल कर सकते हैं तो डिफ़ॉल्ट को क्यों ओवरराइड करें जो डिफ़ॉल्ट से अधिक पूर्वता लेगा।

एक कस्टम favicon.icoफ़ाइल प्राप्त करने के लिए , मैंने src/main/resourcesअपने एप्लिकेशन के लिए एक निर्देशिका बनाई और फिर favicon.icoफ़ाइल को वहां कॉपी किया । इस संसाधन निर्देशिका की फ़ाइलों को संकलित JAR की जड़ में ले जाया जाता है और इसलिए आपका कस्टम favicon.icoस्प्रिंग प्रदान किए जाने से पहले पाया जाता है।

उपरोक्त करने से आपके अद्यतन समाधान के समान प्रभाव प्राप्त हुआ।

ध्यान दें कि v1.2.0 के बाद से आप फ़ाइल को अंदर रख सकते हैं src/main/resources/static


6
वजह साफ है। मैं फ़ेविकॉन फ़ाइल को JAR में नहीं डालना चाहता।
जियोट्रैट z

@zeodtr क्यों उत्सुक है। यह मुझे सबसे स्वाभाविक लगता है। हालांकि, मैं यह उम्मीद है में होना होगाsrc/main/resources/static/images
btiernay

1
@btiernay यह इसलिए है क्योंकि वेब सर्वर वेब क्लाइंट से अलग इकाई है। और favicon (s) क्लाइंट के अंतर्गत आता है। वेब सर्वर की युद्ध फाइल में क्लाइंट से संबंधित फाइलों को शामिल करने का कोई कारण नहीं है जिसे उपयोगकर्ताओं की आवश्यकता के अनुसार अधिक बार संशोधित किया जा सकता है।
जियोट्रैप्ट

बस एक FYI करें, यह अब संभव संकल्प करने के लिए है favicon.icoसे static: github.com/spring-projects/spring-boot/commit/...
btiernay

1
src / main / resource / स्थिर पथ अच्छी तरह से काम करता है। यह करने का सबसे सरल और नियमित तरीका है।
pdem

29

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

मैंने अभी-अभी अपने html पेज हेड में अपना फेविकॉन लिंक जोड़ा है।

<link rel="icon" type="image/png" href="images/fav.png">

तब मैंने अपने फेविकॉन का नाम बदलकर इसे रखा

<ProjFolder>/src/main/resources/static/images/fav.png

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


4
आपको हैंडलर मैपिंग के साथ किसी और जगह पर चक्कर लगाने की ज़रूरत नहीं है (बस अपने स्थिर संसाधनों में एक favicon.ico डालें)।
डेव सीर

यह इतना आसान है! धन्यवाद। मैं इसे अपने टुकड़े में जोड़ता हूं।
लीनग्रोस

क्या होगा यदि आप केवल एक एपीआई सेवा बैकएंड के रूप में स्प्रिंगबूट का उपयोग कर रहे हैं, तो आपके पास कोई html पृष्ठ नहीं हैं: /
परमवीर सिंह करवाल

@ParamvirSinghKarwal यदि आपके पास केवल एक सेवा है, तो आप फेविकॉन क्यों चाहते हैं?
jeremyjjbrown

यदि आप ब्राउज़र के पते से सीधे एपीआई को मारते हैं, तो यह स्प्रिंग एप्लिकेशन का डिफ़ॉल्ट फ़ेविकॉन दिखाता है जो हरे पत्ते की तरह होता है। मैं चाहता हूं कि यह एक ब्रांडेड फेविकॉन हो। मैं यह करने में सक्षम था।
परमवीर सिंह करवाल

13

स्प्रिंग बूट 1.2.2 और 1.1.11 के बाद से आप आसानी से spring.mvc.favicon.enabled = falseसंपत्ति का उपयोग करके डिफ़ॉल्ट फ़ेविकॉन को अक्षम कर सकते हैं।

अधिक informations की यात्रा के लिए:

अद्यतन: spring.mvc.favicon.enabledस्प्रिंग बूट 2.2.x के बाद से अब कोई संपत्ति नहीं है


spring.mvc.favicon.enabled को स्प्रिंग बूट 2.2 से हटा दिया गया है। क्या आप जानते हैं कि इसे किससे बदला जाता है?
शिलान

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

1
हाँ, अंत में मुझे पता चला कि मुझे इसके बजाय ऐसा करने की आवश्यकता है: @Override public void addResourceHandlers (रिसोर्सहैंडलर रीजिस्ट्री रजिस्ट्री) {रजिस्ट्री.addResourceHandler ("/ favicon.ico") addResourceLocations ("classpath: / static /")। }
शिलान

2

बूट के नए संस्करण (1.2 सुनिश्चित करने के लिए लेकिन शायद 1.1.8 भी) आपको अपने स्थिर संसाधनों में सिर्फ एक फेविकॉन.निको लगाने की अनुमति देते हैं।


2

मैंने बहुत सारे विकल्प / वेरिएंट की कोशिश की, लेकिन केवल यही काम किया। (स्प्रिंग बूट 2.2.7)

Favicon.ico फ़ाइलें और robots.txt में / संसाधन / स्थिर

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
  protected void configure(HttpSecurity http) throws Exception { 
    http
      .authorizeRequests()
        .antMatchers("/favicon.ico").permitAll()
        .antMatchers("/robots.txt").permitAll()
        .antMatchers("/").permitAll()
        .anyRequest().authenticated();
    }
}

तथा

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler(
      "/favicon.ico",
      "/robots.txt")
      .addResourceLocations(
        "classpath:/static/");
  }
}

यदि यह मदद करता है, तो कृपया इसे पसंद करें;)


1

registry.addResourceHandler ( "/ robots.txt") addResourceLocations ( "/")।

registry.addResourceHandler ( "/ favicon.ico") addResourceLocations ( "/")।

robots.txt, favicon.ico फ़ाइल स्थान: / src / मुख्य / संसाधन

मैंने स्प्रिंग बूट 1.2.1 का उपयोग किया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.