2010-08-12 10 views
6

शामिल है क्या फ़िल्टरमैपिंग को उपनिर्देशिका शामिल करने का कोई तरीका नहीं है?फ़िल्टर मैपिंग यूआरएल-पैटर्न जिसमें उपनिर्देशिका

उदाहरण के लिए।

मेरे पास मेरे संदर्भ रूट में .xhtml फ़ाइलें हैं, और मेरे पास एक ही एक्सटेंशन वाले फाइलों के साथ "परीक्षण" नामक सबफ़ोल्डर भी है। क्या संदर्भ रूट में फ़ाइलों को फ़िल्टर करने के लिए कोई भी संदेश हो सकता है, न कि "परीक्षण" निर्देशिका में फ़ाइलों के लिए?

उत्तर

17

url-pattern मिलान में वास्तव में प्रतिबंधित है। यह केवल सटीक, उपसर्ग या प्रत्यय matchnig की अनुमति देता है। बीच/समग्र/regex मिलान नहीं है। तो उदा। /*.xhtml जो आप करना चाहते हैं वह काम नहीं करेगा।

// First cast ServletRequest to HttpServletRequest. 
HttpServletRequest hsr = (HttpServletRequest) request; 

// Check if requested resource is not in /test folder. 
if (!hsr.getServletPath().startsWith("/test/")) { 
    // Not in /test folder. Do your thing here. 
} 

HttpServletRequest#getServletPath() मूल रूप से रिटर्न:

आप /test फ़ोल्डर में एक्सएचटीएमएल से निकालना चाहते हैं केवल, तो अपने सबसे अच्छे वास्तव में एक Filter*.xhtml जो मूल रूप से doFilter() विधि में निम्नलिखित काम करता है की एक url-pattern पर सुन है संदर्भ पथ से अनुरोध यूआरआई का हिस्सा।

यदि आप फ़िल्टर के के रूप में /test को फ़िल्टर के कोड के रूप में आवश्यक मानते हैं तो आप फ़िल्टर के कोड में web.xml के अंदर से मूल्य को नियंत्रित कर सकते हैं।

+1

मैंने पहली बार फ़िल्टर में कोडित हार्ड सोचा था? लेकिन init-param स्मार्ट है। यहाँ कुछ सीखा है। – JoseK

+0

@ जोस: आपका स्वागत है। – BalusC

-1

कुछ कंटेनर (जैसे राल) वेब.एक्सएमएल में फ़िल्टर मैपिंग परिभाषा के लिए एक एक्सटेंशन को परिभाषित करते हैं जो url-regexp निर्दिष्ट करने की अनुमति देता है जो नियमित अभिव्यक्ति के आधार पर यूआरएल से मेल खाता है। (reference)। देखें कि आपके कंटेनर में ऐसा कुछ है या नहीं।

0

मानक सर्लेट/फ़िल्टर के लिए जो उपलब्ध है उसका उपयोग करना, उपनिर्देशिका को बाहर करने का कोई सीधा तरीका नहीं है, क्योंकि *.ext शैली मैपिंग में उपनिर्देशिका शामिल हैं। आप एक और फ़िल्टर घोषित करके इसके आसपास काम कर सकते हैं जो विशेष रूप से /test/*.xhtml मैपिंग को संभालता है और उसके अनुसार संभालता है।

+0

लेकिन मैपिंग/* के साथ एक फ़िल्टर में अभी भी सबकुछ शामिल होगा/परीक्षण नहीं होगा? –

+0

यह सही है। मैं सोच रहा था कि मिलान वाला पहला व्यक्ति इस्तेमाल होता है, लेकिन ऐसा नहीं है। इसके बजाय, आप अपने फ़िल्टर में एक यूआरएल रेगेक्स चेक जोड़ सकते हैं - यदि यह रेगेक्स से मेल खाता है, तो फ़िल्टर रीमैनिंग फ़िल्टर श्रृंखला को प्रस्तुत करने से पहले इसका काम करता है। यदि रेगेक्स इससे मेल नहीं खाता है तो बिना किसी काम किए फ़िल्टर फ़िल्टर में प्रतिनिधि होता है। – mdma

3

समाधान, मूल रूप से आप अपने खुद के फिल्टर वर्ग की जरूरत है और फिल्टर

package test; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class LoginValidationFilter implements Filter { 

    private String loginPage = ""; 
    private List<String> excludedURLs; 

    public void init(FilterConfig filterConfig) throws ServletException { 
     this.loginPage = filterConfig.getInitParameter("loginPage"); 

     String[] excluded = filterConfig.getInitParameter("excludedURLs").split(";"); 
     excludedURLs = new ArrayList<String>(); 
     for (int i = 0; i < excluded.length; i++) { 
      excludedURLs.add(excluded[i]); 
     } 
    } 

    public void destroy() { 
     this.loginPage = ""; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, 
      ServletException { 

     HttpServletRequest httpRequest = request instanceof HttpServletRequest ? (HttpServletRequest) request : null; 
     HttpServletResponse httpResponse = response instanceof HttpServletResponse ? (HttpServletResponse) response 
       : null; 

     if (httpRequest == null || httpResponse == null) { 
      filterChain.doFilter(request, response); 
      return; 
     } 

     boolean isExcludedURL = false; 
     for (int i = 0; i < excludedURLs.size(); i++) { 
      if (httpRequest.getRequestURL().indexOf(excludedURLs.get(i)) > -1) { 
       isExcludedURL = true; 
       break; 
      } 
     } 

     if (isExcludedURL) { 
      filterChain.doFilter(request, response); 
     } else { 
      if (UserUtil.validateUserLogin(httpRequest)) { 
       filterChain.doFilter(request, response); 
      } else { 
       httpResponse.sendRedirect(httpRequest.getContextPath() + loginPage); 
      } 
     } 
    } 
} 

के लिए init-परम के रूप में छोड़कर URL निर्धारित और फिल्टर, मानचित्रण को परिभाषित करने और web.xml में URL को छोड़ने

<filter> 
    <filter-name>LoginValidationFilter</filter-name> 
    <filter-class>test.LoginValidationFilter</filter-class> 
    <init-param> 
     <param-name>loginPage</param-name> 
     <param-value>/login.jsp</param-value> 
    </init-param> 
    <init-param> 
     <param-name>excludedURLs</param-name> 
     <param-value>/admin/;/assets/;/content/;/css/;/js/;/login.jsp;/login.cmd;/logout.cmd;forgot_password.jsp;pageName=</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>LoginValidationFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

क्षमा करें, यह मेरी पहली पोस्ट है, मुझे प्रारूप को सही करने में लगभग 30 मिनट लग गए। समाधान, मूल रूप से आपको अपनी खुद की फ़िल्टर श्रेणी की आवश्यकता होती है और फ़िल्टर के लिए इनट-पैरा के रूप में यूआरएल को छोड़कर परिभाषित किया जाता है। – softskin

0

आप संदर्भ रूट में मौजूद प्रत्येक फ़ाइल के लिए एक url-mapping मान जोड़ सकते हैं, इसलिए फ़िल्टर उन फ़ाइलों पर लागू होगा लेकिन परीक्षण फ़ोल्डर में फ़ाइलों के लिए कोई भी नहीं (वास्तव में यह केवल उन विशिष्ट फ़ाइलों पर लागू होगा)। निम्नलिखित मेरे लिए

<url-pattern>/index.faces</url-pattern>