आने वाले सर्वलेट अनुरोध url को बदलने के लिए जावा में एक सर्वलेट फ़िल्टर का उपयोग कैसे करें?


186

आने वाले सर्वलेट अनुरोध url से बदलने के लिए मैं एक सर्वलेट फ़िल्टर का उपयोग कैसे कर सकता हूं

http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123

सेवा

http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123

?


अपडेट : नीचे BalusC के चरणों के अनुसार, मैं निम्नलिखित कोड के साथ आया:

public class UrlRewriteFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {
        //
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        String requestURI = request.getRequestURI();

        if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
            String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
            String newURI = requestURI.replace(toReplace, "?Contact_Id=");
            req.getRequestDispatcher(newURI).forward(req, res);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
        //
    }
}

इस तरह से प्रासंगिक प्रविष्टि web.xml:

<filter>
    <filter-name>urlRewriteFilter</filter-name>
    <filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>urlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

मैंने अपेक्षित परिणामों के साथ सर्वर-साइड और क्लाइंट-साइड दोनों को पुनर्निर्देशित करने की कोशिश की। यह काम किया, धन्यवाद BalusC!


संबंधित प्रश्न: stackoverflow.com/questions/2723829/…
BalusC

सर्वलेट कल्पना के किस संस्करण का आप उपयोग कर रहे हैं? आप विभिन्न संस्करणों के साथ परिवर्तनों को कैसे अग्रेषित करते हैं।
रोमेन हिप्पो

इस पोस्ट को देखें इसमें एक फ़िल्टर भी है जो आप चाहते हैं
रोमेन हिप्पो

कृपया ध्यान दें कि यदि आपके मूल URL में पैरामीटर हैं, जैसे nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123 ? ** param1 = A और param2 = B ** तो ये पैरामीटर अगले सर्वलेट / jsp पर भी भेज दिए जाएंगे? मुझे मूल मापदंडों से छुटकारा पाने या बदलने का कोई तरीका नहीं मिला (केवल HttpServletRequestWrapper का उपयोग करके)। कोई भी विचार? .. अद्यतन: ऐसा लगता है कि http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ इस समस्या का समाधान करता है।
लोपोटन

धन्यवाद मैं url पुनर्लेखन और एन्क्रिप्शन पर एक उदाहरण के लिए खोज रहा था।
आदित्य यदा

जवाबों:


281
  1. लागू करें javax.servlet.Filter
  2. में doFilter()विधि, भेजे डाली ServletRequestको HttpServletRequest
  3. HttpServletRequest#getRequestURI()पथ को पकड़ने के लिए उपयोग करें ।
  4. सीधा प्रयोग करें java.lang.Stringजैसे तरीकों substring(), split(), concat()और इतने पर ब्याज का हिस्सा निकालने और नया पथ रचना के लिए।
  5. का प्रयोग करें या तो ServletRequest#getRequestDispatcher()और फिर RequestDispatcher#forward()नया URL (सर्वर साइड रीडायरेक्ट, ब्राउज़र पता पट्टी में परिलक्षित नहीं) के लिए अनुरोध / प्रतिक्रिया अग्रेषित करने के लिए, या डाली भेजे ServletResponseकरने के लिए HttpServletResponseऔर उसके बाद HttpServletResponse#sendRedirect()में परिलक्षित नया URL के जवाब (क्लाइंट साइड रीडायरेक्ट, रीडायरेक्ट करने के लिए ब्राउज़र पता बार)।
  6. में फिल्टर रजिस्टर web.xmlएक पर url-patternकी /*या /Check_License/*, संदर्भ पथ पर निर्भर करता है, या यदि आप सर्वलेट 3.0 कगार पर हैं, का उपयोग करें @WebFilterकि बजाय के लिए एनोटेशन।

कोड में एक चेक को जोड़ने के लिए यदि URL मत भूलना जरूरतों को बदलने की है और यदि नहीं , तो बस फोन FilterChain#doFilter(), और यह एक अनंत लूप में खुद को कॉल करेंगे।

वैकल्पिक रूप से आप सिर्फ एक मौजूदा 3 पार्टी एपीआई का उपयोग कर सकते हैं ताकि आप के लिए सभी काम कर सकें , जैसे कि टके के उरलवेराइटफिल्टर जिसे अपाचे के साथ आप जिस तरह से कॉन्फ़िगर करेंगे mod_rewrite


1
किसी भी doFilter () नमूना कोड कहीं है कि ऊपर करता है? धन्यवाद।
फ्रैंक

20
ठीक किस कदम पर आप फंस रहे हैं? मेरा उत्तर लगभग कोड ही लिखता है। क्या आपने यह भी नोट किया है कि नीले रंग में कोड संदर्भ वास्तव में Javadocs के लिंक होते हैं जो वर्ग / विधि व्यवहार के बारे में विस्तार से बताते हैं? किसी भी तरह से, आप पा सकते हैं यहाँ और यहाँ अच्छा JSP / Servlet ट्यूटोरियल, विशेष रूप से इस फ़िल्टर के बारे में एक।
बालुस 21

1
मुझे लगता है कि यह सही है, लेकिन यदि फ़िल्टर श्रृंखला में सबसे पहले में से एक है, और RequestDispatcher#forward()निष्पादित किया जाता है, तो शेष फ़िल्टर निष्पादित नहीं किए जाएंगे। तो, एक बेहतर तरीका नहीं होगा तो यह एक सर्वलेट के रूप में कर रहा है?
लुकासाइक

2
@datakey: या तो ऑर्डर को फिर से व्यवस्थित करें या <dispatcher>FORWARD</dispatcher>फ़िल्टर मैपिंग में जोड़ें ।
बालुसक

1
@ JimJim2000: बस या तो ऑर्डर को फिर से व्यवस्थित करें या <dispatcher>FORWARD</dispatcher>फ़िल्टर मैपिंग में जोड़ें ।
बालुस १५'१६


7

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

public class UrlPrettyfierFilter implements Filter {

    private static final String JSF_VIEW_ROOT_PATH = "/ui";

    private static final String JSF_VIEW_SUFFIX = ".xhtml";

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
        String requestURI = httpServletRequest.getRequestURI();
        //Only process the paths starting with /ui, so as other requests get unprocessed. 
        //You can register the filter itself for /ui/* only, too
        if (requestURI.startsWith(JSF_VIEW_ROOT_PATH) 
                && !requestURI.contains(JSF_VIEW_SUFFIX)) {
            request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
                .forward(request,response);
        } else {
            chain.doFilter(httpServletRequest, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.