HttpServletRequest में getRequestURI और getPathInfo के तरीकों में क्या अंतर है?


143

मैं एक सरल, बहुत हल्का फ्रंट-कंट्रोलर बना रहा हूं। मुझे सही चयन करने के लिए विभिन्न हैंडलर (क्रियाओं) के अनुरोध पथ से मिलान करना होगा।

मेरे स्थानीय मशीन पर HttpServletRequest.getPathInfo()और HttpServletRequest.getRequestURI()उसी परिणाम को वापस करें। लेकिन मुझे यकीन नहीं है कि वे प्रोडक्शन के माहौल में क्या करेंगे।

तो, इन पद्धति में क्या अंतर है और मुझे क्या चुनना चाहिए?


1
आपको यह उत्तर उपयोगी भी लग सकता है।
बालूसी 12

@ बाल्सक: धन्यवाद, मैं पहले से ही उस उत्तर से कुछ युक्तियों का उपयोग कर रहा हूं।
रोमन

यह एक अच्छे आरेख के साथ अंतर की व्याख्या करता है: agiletribe.wordpress.com/2016/02/23/…
AgilePro

जवाबों:


77

getPathInfo()URI के बाद अतिरिक्त पथ की जानकारी देता है, जिसका उपयोग आपके सर्वलेट तक पहुँच के लिए किया जाता है, जहाँ getRequestURI()पूरा URI मिलता है।

मैंने सोचा होगा कि वे अलग-अलग होंगे, यह देखते हुए कि सर्वलेट को पहले ही अपने यूआरआई पैटर्न के साथ कॉन्फ़िगर किया जाना चाहिए; मुझे नहीं लगता कि मैंने कभी रूट (/) से सर्वलेट सर्व किया है।

उदाहरण के लिए यदि सर्वलेट 'फू' को URI '/ foo' में मैप किया जाता है, तो मुझे लगता है कि URI:

/foo/path/to/resource

परिणाम होगा:

RequestURI = /foo/path/to/resource

तथा

PathInfo = /path/to/resource

20
डिकोडिंग व्यवहार के बारे में ध्यान देने योग्य है। getRequestURI () स्ट्रिंग को डीकोड नहीं करता है। जहाँ getPathInfo () डीकोड करता है।
कविन्दु डोडंडुवा

1
कुछ मामलों getRequestURI()में मुझे "/foo/path/to/resource"उम्मीद के अनुसार तार देता है, लेकिन getPathInfo()उसी HttpServletRequestवस्तु के लिए मुझे देता है null। दुनिया में क्या चल रहा है? EDIT: इसका उत्तर "30 वें" उपयोगकर्ता द्वारा दिया गया है।
औरदेरो

460

मैं यहाँ एक छोटी तुलना तालिका रखूँगा (बस इसे कहीं रखने के लिए):

सर्वलेट के रूप में मैप किया गया है /test%3F/*और एप्लिकेशन के तहत तैनात किया गया है /app

http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a

Method              URL-Decoded Result           
----------------------------------------------------
getContextPath()        no      /app
getLocalAddr()                  127.0.0.1
getLocalName()                  30thh.loc
getLocalPort()                  8480
getMethod()                     GET
getPathInfo()           yes     /a?+b
getProtocol()                   HTTP/1.1
getQueryString()        no      p+1=c+d&p+2=e+f
getRequestedSessionId() no      S%3F+ID
getRequestURI()         no      /app/test%3F/a%3F+b;jsessionid=S+ID
getRequestURL()         no      http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S+ID
getScheme()                     http
getServerName()                 30thh.loc
getServerPort()                 8480
getServletPath()        yes     /test?
getParameterNames()     yes     [p 2, p 1]
getParameter("p 1")     yes     c d

उदाहरण में सर्वर ऊपर चल रहा है localhost:8480और नाम 30thh.locOS hostsफ़ाइल में डाला गया है ।

टिप्पणियाँ

  • "+" केवल क्वेरी स्ट्रिंग में स्थान के रूप में नियंत्रित किया जाता है

  • एंकर "# ए" सर्वर पर स्थानांतरित नहीं होता है। केवल ब्राउज़र ही इसके साथ काम कर सकता है।

  • यदि url-patternसर्वलेट मैपिंग में *(उदाहरण के लिए ) /testया के साथ समाप्त नहीं होता है *.jsp, तो getPathInfo()रिटर्न null

यदि स्प्रिंग MVC का उपयोग किया जाता है

  • विधि getPathInfo()रिटर्न null

  • विधि getServletPath()संदर्भ पथ और सत्र ID के बीच का भाग देता है। मूल्य से ऊपर के उदाहरण में होगा/test?/a?+b

  • का URL इनकोडिंग भागों से सावधान रहें @RequestMappingऔर @RequestParamवसंत में। यह छोटी गाड़ी है (वर्तमान संस्करण 3.2.4) और आमतौर पर उम्मीद के मुताबिक काम नहीं कर रही है


20
मैं आपका जवाब छाप रहा हूं और इसे हमारे कार्यालय में पोस्टर के रूप में रख रहा हूं। यह कितना उपयोगी है!
इब्राहिम दुख

2
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.प्रतिभाशाली।
बोरिस ट्रेखोव

1
मैं दोनों का मानना है getRequestURI()और getRequestURL()गैर डीकोड jsessionid लौटना चाहिए, इस मामले में S%3F+ID। कम से कम यह टॉमकैट / 8.5.6 पर करता है।
गिडमिनस रिम्स

30

चलिए उस पूर्ण URL को तोड़ते हैं जिसे एक क्लाइंट आपके सर्वलेट तक पहुंचने के लिए अपने एड्रेस बार में टाइप करेगा:

http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo

भागों हैं:

  1. योजना: http
  2. होस्टनाम: www.example.com
  3. बंदरगाह: 80
  4. संदर्भ पथ: awesome-application
  5. सर्वलेट पथ: path/to/servlet
  6. पथ की जानकारी: path/info
  7. क्वेरी: a=1&b=2
  8. टुकड़ा: boo

अनुरोध URI ( getRequestURI द्वारा लौटाया गया ) 4, 5 और 6 भागों से मेल खाता है।

(संयोग से, भले ही आप इसके लिए नहीं पूछ रहे हों, लेकिन विधि getRequestURL आपको 1, 2, 3, 4, 5 और 6 भाग देगा)।

अभी:

  • भाग 4 (संदर्भ पथ) का उपयोग सर्वर में चलने वाले कई अन्य अनुप्रयोगों में से आपके विशेष एप्लिकेशन को चुनने के लिए किया जाता है
  • भाग 5 (सर्वलेट पथ) का उपयोग कई अन्य सर्वलेटों में से एक विशेष सर्वलेट का चयन करने के लिए किया जाता है जिसे आपके पासपोर्ट में बंडल किया जा सकता है
  • भाग 6 (पथ की जानकारी) की व्याख्या आपके सर्वलेट के तर्क द्वारा की जाती है (जैसे यह आपके सर्वलेट द्वारा नियंत्रित कुछ संसाधन की ओर इशारा कर सकता है)।
  • भाग 7 (क्वेरी) को भी getQueryString का उपयोग करके अपने सर्वलेट को उपलब्ध कराया जाता है
  • भाग 8 (टुकड़ा) भी सर्वर को नहीं भेजा जाता है और केवल क्लाइंट के लिए प्रासंगिक और ज्ञात होता है

निम्नलिखित हमेशा रखती है (URL एन्कोडिंग मतभेदों को छोड़कर):

requestURI = contextPath + servletPath + pathInfo

सर्वलेट 3.0 विनिर्देश से निम्न उदाहरण बहुत उपयोगी है:


नोट: छवि इस प्रकार है, मेरे पास HTML में पुनः बनाने का समय नहीं है:

यहां छवि विवरण दर्ज करें


16

निम्नलिखित सर्वलेट कॉन्फ पर विचार करें:

   <servlet>
        <servlet-name>NewServlet</servlet-name>
        <servlet-class>NewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>NewServlet</servlet-name>
        <url-pattern>/NewServlet/*</url-pattern>
    </servlet-mapping>

अब, जब मैं URL को हिट http://localhost:8084/JSPTemp1/NewServlet/jhiकरूंगा, तो NewServletयह ऊपर वर्णित पैटर्न के साथ मैप किया गया है।

यहाँ:

getRequestURI() =  /JSPTemp1/NewServlet/jhi
getPathInfo() = /jhi

हमारे पास वे हैं:

  • getPathInfo()

    रिटर्न
    एक स्ट्रिंग,, वेब कंटेनर द्वारा डिकोड अतिरिक्त पथ जानकारी है कि सर्वलेट पथ के बाद, लेकिन अनुरोध URL में क्वेरी स्ट्रिंग से पहले आता है निर्दिष्ट करने; या यदि URL में कोई अतिरिक्त पथ जानकारी नहीं है तो अशक्त है

  • getRequestURI()


    क्वेरी स्ट्रिंग तक प्रोटोकॉल नाम से URL का एक भाग युक्त स्ट्रिंग लौटाता है

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