2010-08-04 12 views
6

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

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

    HttpServletRequest httpServletRequest = (HttpServletRequest)request; 

    if (some condition equals true) { 
     httpServletRequest.getRequestDispatcher("/home.jsp").forward(request, response); 
     return; 
    } else { 
     chain.doFilter(request, response); 
    } 
} 

उदाहरण:

<filter> 
    <filter-name>MyFilter</filter-name> 
    <filter-class>com.filters.MyFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>MyFilter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

उत्तर

14

"प्रतिबद्ध" एक HttpServletResponse की स्थिति वास्तव में कह रही है कि क्या प्रतिक्रिया हेडर अंतर्निहित सॉकेट लिए लिखा गया है का एक तरीका है। एक "प्रतिबद्ध" प्रतिक्रिया में लिखा गया है (कम से कम) पहली पंक्ति लिखी गई है। चूंकि प्रतिक्रिया की पहली पंक्ति में स्थिति कोड होता है, यह इस प्रकार है कि आप प्रतिबद्ध प्रतिक्रिया के स्टेटस कोड को नहीं बदल सकते हैं ... और इसका मतलब है कि रीडायरेक्ट करने के लिए स्थिति को 3xx में बदलने में बहुत देर हो चुकी है। इसी तरह, आप स्थानीय अग्रेषण नहीं कर सकते क्योंकि आप पहले ही प्रतिक्रिया भेजना शुरू कर चुके हैं।

4

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

संपादित करें:

जो एक CharResponseWrapper का उपयोग करता है एक कोड उदाहरण के लिए Programming Customized Requests and Responses अनुभाग देखें। उदाहरण एक कस्टम राइटर का उपयोग करता है, लेकिन इसे आसानी से आउटपुटस्ट्रीम तक बढ़ाया जा सकता है। आपके सर्वलेट का उपयोग कैसे किया जाता है, इस पर आधारित है, आपको मूल प्रतिक्रिया पर कुछ भी करने में देरी करने के लिए getWriter() और getOutputStream() पर एक या दोनों को ओवरराइड करना होगा। इसके अलावा, false वापस करने के लिए आपको isCommitted() को ओवरराइड करने की आवश्यकता होगी, ताकि अग्रेषित फ़िल्टर श्रृंखला के नीचे किसी भी समय निष्पादित किया जा सके। रीडायरेक्ट/फॉरवर्ड के बाद नई सामग्री (हेडर सहित) को स्टोर करने के लिए आपको resetBuffer() को नया OutputStream/Writer प्रारंभ करने के लिए ओवरराइड करने की भी आवश्यकता होगी।

+0

क्या आप उपरोक्त वांछित '/ home.jsp' रीडायरेक्ट के आधार पर कुछ 'नमूना कोड' प्रदान कर सकते हैं? मुझे इस मुद्दे से भी परेशानी हो रही है। धन्यवाद! – DougA

+0

@DougA मेरे उत्तर में संपादन की जांच करें। संक्षेप में यह बताना चाहिए कि क्या करने की जरूरत है। – shams

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