दिलचस्प पोस्ट
एक विशिष्ट प्रतिबद्ध करने के लिए आप कैसे एक जीआईटी भंडार वापस (रीसेट) रोल? मॉडल्स की सूची के लिए रिमोट मान्यता सी # के साथ Hoey Shamos एल्गोरिथ्म कार्यान्वित वर्ण को तिथि में परिवर्तित करें * जल्दी * आर में आर में कंसोल को साफ़ करने के लिए फ़ंक्शन कैप्चर कंसोल बाहर निकलना C # पायथन और सबप्रोसेस के साथ विंडोज पर यूनिकोड फाइलनाम। पोपेन () @ मॉडेल अटिटेशन एनोटेशन, इसका उपयोग कब किया जाए? HTTP पर जावास्क्रिप्ट में द्विआधारी डेटा भेजा जा रहा है दोहरे सिम एंड्रॉइड फोन में दो सिम कार्ड की स्थिति का पता लगाएं ArrayIndexOutOfBoundsException जब किसी सरणी के सभी तत्वों के जरिए घुमाने जाते हैं कोणीय- cli सर्वर – प्रॉक्सी एपीआई अनुरोधों को किसी अन्य सर्वर पर कैसे करें? ASP.NET MVC रूटिंग विधि विधि के माध्यम से INSTALL_FAILED_DEXOPT कैसे इस त्रुटि को हल करने के लिए? डब्ल्यूएलएस के साथ एक एकल। Exe में डीएलएस मर्ज करना

क्या मैं <url-pattern> अंदर <filter-maping> कुछ ठोस यूआरएल को बाहर कर सकता हूं?

मैं चाहता हूं कि कुछ कंक्रीट फ़िल्टर एक कंक्रीट के लिए छोड़कर सभी यूआरएल के लिए लागू हो जाए (अर्थात् /specialpath लिए /specialpath लिए)।

क्या ऐसा करने की कोई संभावना है?


नमूना कोड:

 <filter> <filter-name>SomeFilter</filter-name> <filter-class>org.somproject.AFilter</filter-class> </filter> <filter-mapping> <filter-name>SomeFilter</filter-name> <url-pattern>/*</url-pattern> <!-- the question is: how to modify this line? --> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> 

वेब के समाधान से एकत्रित समाधान "क्या मैं <url-pattern> अंदर <filter-maping> कुछ ठोस यूआरएल को बाहर कर सकता हूं?"

मानक सर्विस एपीआई इस सुविधा का समर्थन नहीं करता है। आप या तो इस तरह के ट्यूकी के लिए एक पुन: लिखना- URL फिल्टर का उपयोग करना चाहते हैं (जो कि बहुत समान अपाचे है HTTPD mod_rewrite ), या /* पर सुनकर फ़िल्टर की doFilter() विधि में एक चेक जोड़ने के लिए।

 String path = ((HttpServletRequest) request).getRequestURI(); if (path.startsWith("/specialpath/")) { chain.doFilter(request, response); // Just continue chain. } else { // Do your business stuff here for all paths other than /specialpath. } 

आप आवश्यक हो सकते हैं, तो फिल्टर का एक init-param के रूप में पथ-टू-हो-अनदेखा करने के लिए निर्दिष्ट करें ताकि आप इसे वेब में भी नियंत्रित कर सकें। web.xml आप इसे फ़िल्टर में निम्नानुसार प्राप्त कर सकते हैं:

 private String pathToBeIgnored; public void init(FilterConfig config) { pathToBeIgnored = config.getInitParameter("pathToBeIgnored"); } 

अगर फ़िल्टर तृतीय पक्ष एपीआई का हिस्सा है और इस प्रकार आप इसे संशोधित नहीं कर सकते हैं, तो इसे एक अधिक विशिष्ट url-pattern पर मैप करें, उदाहरण के लिए /otherfilterpath/* और उस पर एक नया फिल्टर बनायें जो कि तीसरा पार्टी फिल्टर

 String path = ((HttpServletRequest) request).getRequestURI(); if (path.startsWith("/specialpath/")) { chain.doFilter(request, response); // Just continue chain. } else { request.getRequestDispatcher("/otherfilterpath" + path).forward(request, response); } 

इससे बचने के लिए कि यह फ़िल्टर स्वयं को एक अनंत लूप में कहलाएगा, आपको इसे केवल REQUEST और प्रेषक पर तृतीय पक्ष फ़िल्टर पर सुनना (प्रेषण) देना होगा।

यह भी देखें:

  • सामने नियंत्रक सर्वलेट द्वारा नियंत्रित होने से स्थिर संसाधनों को कैसे रोका जाए, जिस पर मैप किया जाता है / *
  • स्प्रिंग एमवीसी में स्थिर सामग्री को कैसे संभालना है?

मैंने एरिक डाउहेर्टी द्वारा वर्णित एक दृष्टिकोण का उपयोग किया: मैंने एक विशेष सर्विसलेट बनाया है जो हमेशा 403 कोड के साथ उत्तर देता है और सामान्य से पहले इसकी मैपिंग डालता है।

मानचित्रण टुकड़ा:

  <servlet> <servlet-name>generalServlet</servlet-name> <servlet-class>project.servlet.GeneralServlet</servlet-class> </servlet> <servlet> <servlet-name>specialServlet</servlet-name> <servlet-class>project.servlet.SpecialServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>specialServlet</servlet-name> <url-pattern>/resources/restricted/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>generalServlet</servlet-name> <url-pattern>/resources/*</url-pattern> </servlet-mapping> 

और सर्वलेट वर्ग:

 public class SpecialServlet extends HttpServlet { public SpecialServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendError(HttpServletResponse.SC_FORBIDDEN); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendError(HttpServletResponse.SC_FORBIDDEN); } } 

यह दृष्टिकोण तब काम करता है जब आप एक निश्चित फिल्टर को रोकना चाहते हैं और सभी निम्नलिखित वाले हैं। अगर आप उदाहरण के लिए यह अच्छी तरह से काम करना चाहिए अपने एप्लिकेशन लॉकिक (GuiceFilter जैसे किसी फ़िल्टर के माध्यम से) को देने के बजाय अपने सर्वलेट कंटेनर के भीतर कुछ संसाधनों के रूप में स्थिर सामग्री के रूप में सेवा करना चाहते हैं:

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

web.xml

 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/static/*</url-pattern> </servlet-mapping> <filter> <filter-name>StaticResourceFilter</filter-name> <filter-class>com.project.filter.StaticResourceFilter</filter-class> </filter> <filter-mapping> <filter-name>StaticResourceFilter</filter-name> <url-pattern>/static/*</url-pattern> </filter-mapping> <filter> <filter-name>guiceFilter</filter-name> <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> </filter> <filter-mapping> <filter-name>guiceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 

StaticResourceFilter.class

 public class StaticResourceFilter implements Filter { private final static Logger LOGGER = LoggerFactory.getLogger(StaticResourceFilter.class); private static final String RESOURCE_PATH = "/static/"; @Override public void init(final FilterConfig filterConfig) throws ServletException { LOGGER.info("StaticResourceFilter initialized"); } @Override public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { String path = ((HttpServletRequest) request).getServletPath(); if (path.toLowerCase().startsWith(RESOURCE_PATH)) { request.getRequestDispatcher(path).forward(request, response); } else { chain.doFilter(request, response); } } @Override public void destroy() { LOGGER.info("StaticResourceFilter destroyed"); } } 

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

मुझे नहीं लगता कि आप केवल दूसरे विन्यास विकल्प को उन पथों की गणना कर सकते हैं जिन्हें आप फ़िल्टर्ड करना चाहते हैं, इसलिए /* बजाय /* लिए कुछ जोड़ सकते हैं और /that/* आदि, टी एक पर्याप्त समाधान के लिए नेतृत्व जब आप उन पथों का एक बहुत कुछ है

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

संपादित करें

अब जब कि आप का उल्लेख है कि आप फिल्टर के ऊपर कोई नियंत्रण नहीं रखते हैं, तो आप क्या कर सकते हैं या तो उस फिल्टर से प्राप्त होता है जो उस पद्धति से super तरीकों को बुलाता है, जब कि यूआरएल पथ जिसे आप छोड़ना चाहते हैं, वह मौजूद है और फिल्टर श्रृंखला की तरह @ बेलोस सी प्रस्तावित है, या एक ऐसा फिल्टर बनाएं जो आपके फिल्टर और प्रतिनिधियों को उसी परिस्थितियों के अंतर्गत दर्शाता है। दोनों ही मामलों में, फ़िल्टर पैरामीटर में आपके द्वारा जोड़े जाने वाले अभिव्यक्ति पैरामीटर और उन सभी फ़िल्टरों को शामिल किया जाएगा जो आप से प्राप्त करते हैं या इन्हें प्रतिनिधि करते हैं

एक प्रतिनिधि फ़िल्टर (एक आवरण) बनाने का लाभ यह है कि आप लिपटे फ़िल्टर के फ़िल्टर वर्ग को पैरामीटर के रूप में जोड़ सकते हैं और इसे इस तरह की अन्य स्थितियों में पुन: उपयोग कर सकते हैं

मुझे जावा कोड में यूआरएल पैटर्न (/ {servicename} / api / stats /) के आधार पर फ़िल्टर करना पड़ा था।

 if (path.startsWith("/{servicename}/api/statistics/")) { validatingAuthToken(((HttpServletRequest) request).getHeader("auth_token")); filterChain.doFilter(request, response); } 

लेकिन इसके विचित्र, यह सर्विसलेट (/ *) के अलावा यूआरएल पैटर्न का समर्थन नहीं करता है, यह सर्वोलेट एपीआई के लिए एक बहुत ही सामान्य मामला होना चाहिए!

मुझे एक ही समस्या का सामना करना पड़ता है, लेकिन मुझे नीचे एक एन्डर दिखा रहा है।

web.xml

  <!-- set this param value for the filter--> <init-param> <param-name>freePages</param-name> <param-value> MainFrame.jsp; </param-value> </init-param> 

filter.java

 strFreePages = config.getInitParameter("freePages"); //get the exclue pattern from config file isFreePage(strRequestPage) //decide the exclude path 

इस तरह आपको ठोस फ़िल्टर क्लास को परेशान नहीं करना पड़ता है।