2011-12-20 6 views
29

मैं एक विशिष्ट कार्य करने के लिए एक फ़िल्टर लिख रहा हूं लेकिन मैं अपने फ़िल्टर में एक विशिष्ट यूआरएल पैटर्न सेट करने में असमर्थ हूं। मेरे फिल्टर मानचित्रण इस प्रकार है:क्या हम web.xml यूआरएल पैटर्न में नियमित अभिव्यक्तियों का उपयोग कर सकते हैं?

<web.xml> 
    <filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>test.MyFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/org/test/*/keys/*</url-pattern> 
    </filter-mapping> 
</web-app> 

मेरे यूआरएल पैटर्न [ /org/test/ * /keys/ * ] काम नहीं कर रहा जैसा कि मैंने उम्मीद थी।

http://localhost:8080/myapp/org/test/SuperAdminReport/keys/superAdminReport.jsp 
http://localhost:8080/myapp/org/test/Adminreport/keys/adminReport.jsp 
http://localhost:8080/myapp/org/test/OtherReport/keys/otherReport.jsp 
फ़िल्टर पैटर्न उपर्युक्त URL से मेल खाना चाहिए के लिए

तो:

मैं की तरह ब्राउज़र से यूआरएल बोल रहा हूँ। इसे कैसे प्राप्त किया जा सकता है?

+3

जहां तक ​​मुझे पता है, आप urlpattern में केवल एक विशेष फ़ोल्डर की सामग्री ('पथ/से/my/फ़ोल्डर/*') या एक विशेष एक्सटेंशन ('* .do') का उपयोग कर सकते हैं। – bdares

+0

कृपया [इस प्रश्न] में स्वीकृत उत्तर का संदर्भ लें (http://stackoverflow.com/q/26732/922954) – aishwarya

उत्तर

6

आपका यूआरएल काम नहीं करेगा क्योंकि यह वैध यूआरएल पैटर्न नहीं है। आप सर्वलेट मानचित्रण के लिए web.xml में निम्नलिखित जबाब

URL spec

0

का उल्लेख कर सकते, आप केवल start या end में वाइल्डकार्ड आवेदन कर सकते हैं अगर आप में मानचित्रण उठाया नहीं किया जाएगा के बीच वाइल्डकार्ड लागू करने के लिए प्रयास करें।

3

यह काम नहीं करेगा, कोई रेगेक्स का उपयोग नहीं किया जा सकता है। आपके आवेदन के लिए इस यूआरएल उपयोग करके देखें:

http://localhost:8080/myapp/org/test/keys/SuperAdminReport/superAdminReport.jsp 
http://localhost:8080/myapp/org/test/keys/Adminreport/adminReport.jsp 
http://localhost:8080/myapp/org/test/keys/OtherReport/otherReport.jsp 

और अपने web.xml के लिए इस config:

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/org/test/keys/*</url-pattern> 
</filter-mapping> 
35

नहीं, आप वहाँ एक regex का उपयोग नहीं कर सकते। जावा सर्वलेट विशिष्टता v2.4 (अनुभाग srv.11.1) के अनुसार, यूआरएल-पथ का अनुसरण के रूप में व्याख्या की है:

  • एक स्ट्रिंग एक '/' वर्ण के साथ शुरुआत और के साथ समाप्त एक '/ *' पथ मैपिंग के लिए प्रत्यय का उपयोग किया जाता है।
  • '*।' उपसर्ग के साथ शुरू होने वाली स्ट्रिंग को एक्सटेंशन मैपिंग के रूप में उपयोग किया जाता है।
  • एक स्ट्रिंग जिसमें केवल '/' वर्ण होता है, एप्लिकेशन के "डिफ़ॉल्ट" सर्वलेट को इंगित करता है। इस मामले में सर्वलेट पथ अनुरोध है यूआरआई कम से कम पाठ पथ और पथ जानकारी शून्य है।
  • अन्य सभी तारों का उपयोग केवल सटीक मिलान के लिए किया जाता है।

कोई regexes की अनुमति है। जटिल जंगली-कार्ड भी नहीं।

0

पिछली प्रतिक्रियाएं सही हैं कि एक यूआरएल-पैटर्न केवल जंगली-कार्ड चरित्र के साथ शुरू या समाप्त हो सकता है, और इस प्रकार रेगेक्स की वास्तविक शक्ति का उपयोग नहीं किया जा सकता है।

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

नीचे एक साधारण उदाहरण है जिसे रेगेक्स पैटर्न को फ़िल्टर विशेषता में ले जाकर बढ़ाया जा सकता है।

वेब के भीतर फ़िल्टर कॉन्फ़िगरेशन।xml:

<filter> 
    <filter-name>SampleFilter</filter-name> 
    <filter-class>org.test.SampleFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SampleFilter</filter-name> 
    <servlet-name>SampleServlet</servlet-name> 
</filter-mapping> 
<servlet-mapping> 
    <servlet-name>SampleServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

बेसिक फिल्टर कार्यान्वयन है कि किसी भी regex पैटर्न इस्तेमाल कर सकते हैं (क्षमा करें, वसंत के OncePerRequestFilter माता पिता वर्ग का उपयोग करता है):

public class SampleFilter extends OncePerRequestFilter { 

    @Override 
    final protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     if (applyLogic(request)) { 
      //Execute desired logic; 
     } 

     filterChain.doFilter(request, response); 
    } 

    protected boolean applyLogic(HttpServletRequest request) { 
     String path = StringUtils.removeStart(request.getRequestURI(), request.getContextPath()); 

     return PatternMatchUtils.simpleMatch(new String[] { "/login" }, path); 
    } 
} 
8

दूसरों के द्वारा बताया गया है, वहाँ नियमित अभिव्यक्ति मिलान के साथ फिल्टर करने के लिए कोई रास्ता नहीं है केवल मूल सर्वलेट फ़िल्टर सुविधाओं का उपयोग कर। सर्वलेट spec संभवतः यूआरएल के कुशल मिलान के लिए अनुमति देने के तरीके लिखा है, और क्योंकि servlets जावा में नियमित अभिव्यक्ति की उपलब्धता की भविष्यवाणी (नियमित अभिव्यक्ति जावा 1.4 में पहुंचे)।

रेगुलर एक्सप्रेशन की संभावना कम performant (कोई मैं इसे बेंचमार्क नहीं किया है) हो सकता है, लेकिन अगर आप दृढ़ता से समय प्रसंस्करण से विवश नहीं कर रहे हैं और विन्यास में आसानी के लिए प्रदर्शन व्यापार करना चाहते हैं तो आप इस तरह यह कर सकते हैं:

अपने फिल्टर में:

private String subPathFilter = ".*"; 
private Pattern pattern; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    String subPathFilter = filterConfig.getInitParameter("subPathFilter"); 
    if (subPathFilter != null) { 
     this.subPathFilter = subPathFilter; 
    } 
    pattern = Pattern.compile(this.subPathFilter); 
    } 

    public static String getFullURL(HttpServletRequest request) { 
    // Implement this if you want to match query parameters, otherwise 
    // servletRequest.getRequestURI() or servletRequest.getRequestURL 
    // should be good enough. Also you may want to handle URL decoding here. 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    Matcher m = pattern.matcher(getFullURL((HttpServletRequest) servletRequest)); 
    if (m.matches()) { 

     // filter stuff here. 

    } 
    } 

फिर web.xml में ...

<filter> 
    <filter-name>MyFiltersName</filter-name> 
    <filter-class>com.konadsc.servlet.MyFilter</filter-class> 
    <init-param> 
     <param-name>subPathFilter</param-name> 
     <param-value>/org/test/[^/]+/keys/.*</param-value> 
    </init-param> 
    </filter> 
    <filter-mapping> 
    <filter-name>MyFiltersName</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

यह भी doFilter() में अगर बयान inverting द्वारा पैटर्न मैच को बाहर करने के लिए कभी कभी सुविधाजनक है (या शामिल नहीं पैटर्न के लिए एक और init परम है, जो पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है जोड़ें।)

संबंधित मुद्दे