2010-09-07 15 views
6

आपकी मदद कर सकता है क्यों doFilter नहीं बुलाया हो रहीdoFilter जाँच करने के लिए नहीं कहा जाता हो रही

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
<context-param> 
<param-name>log4jConfigLocation</param-name> 
<param-value>/WEB-INF/log4j.properties</param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 
<filter> 
<filter-name>roseFilter</filter-name> 
<filter-class>net.paoding.rose.RoseFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>roseFilter</filter-name> 
<url-pattern>/*</url-pattern> 
<dispatcher>REQUEST</dispatcher> 
<dispatcher>FORWARD</dispatcher> 
<dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 
</web-app> 

वर्ग हस्ताक्षर:

import org.springframework.web.filter.GenericFilterBean; 
public class RoseFilter extends GenericFilterBean { 

404 जबकि कॉल http://localhost:8080/hello/world दिया जाता है, मैं doFilter पर ब्रेकपॉइंट्स सेट करें, ऐसा लगता है कि डिलफिल्टर नहीं कहा जाता है? (मैंने टॉमकैट 6.0.18, 6.0.2 9, जेडीके 1.6)

+1

क्या है/हैलो/दुनिया आपके सर्वर के लिए संसाधन में हल करता है? यदि नहीं, तो फिल्टर श्रृंखला शुरू करने का कोई कारण नहीं है। – rsp

+2

मुझे पूरा यकीन है कि मैं पहले से ही यह पूरा कर चुका हूं, '/ *' पैटर्न काम नहीं कर रहा है। मुझे नहीं लगता कि मैंने कभी इसे हल किया है। – skaffman

+0

@rsp: संसाधन को भौतिक मौजूदा संसाधन होने की आवश्यकता नहीं है। '/ *' पर मैप किए गए फ़िल्टर (और सर्वलेट) को वैसे भी बुलाया जाएगा। यह अर्थात् एक फ्रंट नियंत्रक के रूप में कार्य कर सकता है। – BalusC

उत्तर

21

फिल्टर लागू किया जा नहीं होगा जब:

  1. फिल्टर वर्ग classpath में लापता और/या लोड करने योग्य या instantiable नहीं है। हालांकि आपको सर्वर के स्टार्टअप लॉग में यह ध्यान देना चाहिए था। सर्वर लॉग में पाए गए अपवाद/त्रुटियों की व्याख्या के आधार पर समाधान पाया जाना चाहिए। द्वारा वे;

  2. वहाँ एक और फिल्टर श्रृंखला है जो बुला नहीं है FilterChain#doFilter() में पहले से चल रहा है बल्कि RequestDispatcher#forward() या include() जो श्रृंखला पूरी तरह से किया जा रहा छोड़ दिया (जब वे FORWARD या INCLUDE प्रेषकों पर सुनने नहीं में बाद में फिल्टर की वजह से है, लेकिन डिफ़ॉल्ट केवल REQUEST प्रेषक पर सुनता है)। समाधान या तो गलत फ़िल्टर को ठीक करने के लिए है, या <dispatcher>FORWARD</dispatcher> आदि को तदनुसार जोड़ने के लिए, या web.xml में फ़िल्टर घोषणाओं को पुनर्व्यवस्थित करने के लिए ताकि आपका नया फ़िल्टर से पहले एक और फ़िल्टर (आपको बदले में केवल यह सुनिश्चित करने की आवश्यकता है कि आपका नया फ़िल्टर उपयोग कर रहा है FilterChain#doFilter() ठीक से :))।

  3. अनुरोध यूआरएल सादा गलत है। आपने http://localhost:8080/hello/world का उपयोग किया था। /* पर फ़िल्टर के साथ, इसका मतलब है कि वेबएप संदर्भ रूट होना चाहिए या कम से कम /hello होना चाहिए। अपने वेबैप संदर्भ को सत्यापित करें। मैं बस एक यूआरएल के साथ पुनः प्रयास करूंगा जो एक ही वेबपैप के अंदर एक वैध जेएसपी/सर्वलेट को इंगित करता है जो गैर-404 प्रतिक्रिया उत्पन्न करता है। क्या फ़िल्टर को तब भी बुलाया जाता है?

+0

1. फ़िल्टर क्लास initFilterBean ठीक से कहा जाता है के बाद से अच्छा है। –

+0

2. मैंने web.xml अपडेट किया है, कृपया जांचें। –

+0

मैं नष्ट() एपीआई की जांच करता हूं: इस विधि को फ़िल्टर के भीतर सभी धागे को केवल एक बार बुलाया जाता है। फ़िल्टर विधि समाप्त हो गई है या टाइमआउट अवधि बीत चुकी है। शायद यह टाइमआउट है? –

0

वेब अनुरोध कैसा दिखता है? क्या आप अपने यूआरएल-पैटर्न को * .jsp के बजाय/* के बजाय बदलने का प्रयास कर सकते हैं? यदि आप शुद्ध जेएसपी के अलावा कुछ और उपयोग कर रहे हैं तो इसे विस्तारित करने वाले अनुरोध के लिए जो भी हो, उसे बदलें (जैसे स्ट्रेट्स के लिए यह आमतौर पर * .do) होता है।

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