दिलचस्प पोस्ट
फॉर-लूप के साथ ArrayList से डेटा हटाएं क्या डेटाबेस कॉलम में एक सीमांकित सूची को वास्तव में खराब रखा जा रहा है? PHP जोड़ने और concatenating जब भ्रमित है अद्यतन पैनल पोस्टबैक के बाद जावास्क्रिप्ट कॉलबैक कैसे निष्पादित किया जाता है? SQLAlchemy create_all () तालिकाओं का निर्माण नहीं करता है एक स्ट्रीम ऑब्जेक्ट के लिए सभी लाइनें पढ़ें? एक अच्छा जावास्क्रिप्ट डीबगिंग उपकरण क्या है? एक्लिप्स कंसोल दृश्य जो एएनएसआई रंग कोड का सम्मान करता है? सीक्यूएल तालिका में सी # डाटाटेबल पढ़ें लिनक टू एसक्यूएल "कैसे में (मानों की सूची)" कैसे करें file_get_contents – स्ट्रीम खोलने में विफल: HTTP अनुरोध विफल हो गया! HTTP / 1.1 404 नहीं मिला सभी डुप्लिकेट पंक्तियां ढूंढना, जिसमें "छोटे सबस्क्रिप्ट वाले तत्व" शामिल हैं पायथन में समानांतर प्रोग्रामिंग कैसे करें गतिविधि बनाने से पहले एक्शन बार को कैसे छुपाना है, और फिर इसे फिर से दिखाएं? PHP में क्लाइंट आईपी पता कैसे प्राप्त करें?

क्या मैं <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> 

Solutions Collecting From Web of "क्या मैं <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 

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