संदर्भ मार्ग के बिना अनुरोध URI कैसे प्राप्त करें?


127

विधि request.getRequestURI () संदर्भ पथ के साथ URI देता है।

उदाहरण के लिए, यदि कोई अनुप्रयोग के लिए आधार URL है http://localhost:8080/myapp/(यानी संदर्भ पथ है MyApp ), और मैं फोन request.getRequestURI()के लिए http://localhost:8080/myapp/secure/users, यह वापस आ जाएगी /myapp/secure/users

क्या कोई रास्ता है कि हम केवल इस हिस्से को पा सकते हैं /secure/users, यानी बिना संदर्भ पथ के यूआरआई?


जवाबों:


158

यदि आप एक फ्रंट कॉनोलर सर्वलेट के अंदर हैं जो एक उपसर्ग पैटर्न पर मैप किया गया है, तो आप बस उपयोग कर सकते हैं HttpServletRequest#getPathInfo()

String pathInfo = request.getPathInfo();
// ...

यह मानते हुए कि आपके उदाहरण में सर्वलेट मैप किया गया है /secure, तो यह वापस आ जाएगा /usersजो कि विशिष्ट फ्रंट कंट्रोलर सर्वलेट के अंदर एकमात्र ब्याज की जानकारी होगी।

यदि सर्वलेट को प्रत्यय पैटर्न पर मैप किया गया है (आपके URL उदाहरण हालांकि यह इंगित नहीं करते हैं कि यह मामला है), या जब आप वास्तव में एक फ़िल्टर के अंदर हों (जब-से-आमंत्रित सर्वलेट आवश्यक रूप से अभी तक निर्धारित नहीं है, तो getPathInfo()वापस लौट सकता है null), तो आपका सबसे अच्छा शर्त यह है कि अनुरोध URI को सामान्य Stringविधि का उपयोग करते हुए संदर्भ पथ की लंबाई के आधार पर स्वयं किया जाए :

HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());
// ...

क्या इसके बजाय इसका उपयोग करने का कोई कारण है getServletPath()? मैं एक फ़िल्टर लिख रहा हूं और मैंने देखा कि वह getPathInfo()रिटर्न करता है null, लेकिन getServletPath()पथ माइनस को संदर्भ में भेज देता है (अनुरोध भेजने वाले के पास जाने के लिए उपयुक्त)।
जेसन सी

@JasonC: जैसा कि उत्तर दिया गया है, getPathInfo()यदि उपसर्ग पैटर्न पर फ्रंट कंट्रोलर सर्वलेट मैप नहीं किया गया है , तो अशक्त है।
बालुस

हाँ। मेरा मतलब था: क्या कोई कारण है जो आप getSathletPath पर getPathInfo को पसंद करते हैं? अन्य उच्च स्कोर किए गए उत्तरों में से बहुत से getServletPath का उपयोग नहीं करते हैं, जो मुझे इसके बारे में संदेह कर रहा है और मैं क्यों सोच रहा हूं। मुझे एक सर्वलेट प्रोजेक्ट मिला है जिस पर मैं काम कर रहा हूं और मैं अपने कौशल को थोड़ा चमकाने की कोशिश कर रहा हूं।
जेसन सी

1
@ जैसनक: सर्वलेट पथ परिवर्तन के अधीन है जब आपके पास जेएसएफ या स्प्रिंग एमवीसी की तरह एक सर्वलेट आधारित एमवीसी ढांचा स्थापित होता है। यह तब MVC फ्रेमवर्क के आंतरिक पथ (जैसे के /foo.xhtmlबजाय /foo.jsf) का प्रतिनिधित्व करेगा और वास्तविक अनुरोध URI (एंडूसर के रूप में ब्राउज़र के पता बार में दिखाई देगा)। मूल सर्वलेट पथ इस तरह के मामले में हालांकि कुंजी के साथ अनुरोध विशेषता के रूप में फिर से शुरू करने योग्य है RequestDispatcher.FORWARD_SERVLET_PATH। किसी भी तरह से, प्रश्न स्पष्ट रूप से अनुरोध के लिए पूछता है URI (ब्राउज़र के पता बार में), इसलिए उत्तर उसी पर आधारित है।
बालूसी

74
request.getRequestURI().substring(request.getContextPath().length())

बहुत बढ़िया! यही वह है जिसकी तलाश में मैं हूं।
कारीगर

4
+1 मुझे लगता है कि यह getPathInfo की तुलना में बेहतर उत्तर है क्योंकि इस तथ्य के कारण कि getPathInfo शून्य और अन्य विषमताएं हो सकती हैं। विभिन्न स्प्रिंग कोड getContextPath करता है और इसे URI से वैसे ही हटा देता है जैसे आपने getPathInfo के बजाय किया है।
एडम गेंट

32

वसंत के साथ आप कर सकते हैं:

String path = new UrlPathHelper().getPathWithinApplication(request);

1
बेशक यह एक वर्ग सदस्य चर के रूप में UrlPathHelper जैसे उदाहरण रखने के लिए समझ में आता है ...
जेम्स

हम वास्तविक अनुरोध मानचित्रण url कैसे प्राप्त कर सकते हैं? कृपया यहां मार्गदर्शन करें: stackoverflow.com/questions/60446807/…
Pra_A

14

getPathInfo () कभी-कभी अशक्त लौटते हैं। प्रलेखन HttpServletRequest में

यदि अतिरिक्त पथ की जानकारी नहीं थी, तो यह विधि रिक्त हो जाती है।

मुझे फ़िल्टर में संदर्भ पथ के बिना फ़ाइल करने के लिए पथ प्राप्त करने की आवश्यकता है और getPathInfo () मुझे शून्य प्रदान करें। तो मैं एक और विधि का उपयोग करता हूं: httpRequest.getServletPath ()

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    String newPath = parsePathToFile(httpRequest.getServletPath());
    ...

}

8

यदि आप एक फ़िल्टर के अंदर request.getPathInfo () का उपयोग करते हैं, तो आपको हमेशा अशक्त (कम से कम जेटी के साथ) लगता है।

मेरे विचार में इस समस्या के लिए अमान्य बग + प्रतिसाद प्रतिक्रियाएँ:

https://issues.apache.org/bugzilla/show_bug.cgi?id=28323

मुझे संदेह है कि यह इस तथ्य से संबंधित है कि फ़िल्टर सर्वलेट से अनुरोध प्राप्त होने से पहले चलता है। यह एक कंटेनर बग, या अपेक्षित व्यवहार हो सकता है जिसे मैं पहचान नहीं पा रहा हूं।

संदर्भपाठ हालांकि उपलब्ध है, इसलिए फ़िल्टर में भी fforws समाधान काम करता है। मुझे यह हाथ से करना पसंद नहीं है, लेकिन कार्यान्वयन टूट गया है या


5

ऐसा करने का एक तरीका अनुरोध URI से सेवा के संदर्भ पथ को आराम करना है।

String p = request.getRequestURI();
String cp = getServletContext().getContextPath();

if (p.startsWith(cp)) {
  String.err.println(p.substring(cp.length());
}

पढ़ें यहाँ


-1

हो सकता है कि आप उदाहरण के लिए '/ myapp' को समाप्त करने के लिए विभाजन विधि का उपयोग कर सकते हैं:

string[] uris=request.getRequestURI().split("/");
string uri="/"+uri[1]+"/"+uris[2];

3
यदि मैं अपने एप्लिकेशन को रूट के रूप में लागू करता हूं तो यह समस्या पैदा करेगा और इसका आधार URL लोकलहोस्ट हो जाएगा : 8080 । इस स्थिति में request.getRequestURI () "/ सुरक्षित / उपयोगकर्ता" वापस आ जाएगी और आपकी विभाजन विधि यहां समस्या पैदा करेगी। कोड परिनियोजन पर निर्भर नहीं होना चाहिए।
शिल्पकार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.