2010-11-25 11 views
101

विधि request.getRequestURI() संदर्भ पथ के साथ यूआरआई लौटाता है।संदर्भ पथ के बिना अनुरोध यूआरआई कैसे प्राप्त करें?

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

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

+2

के संभावित डुप्लिकेट [क्या HttpServletRequest में getRequestURI और getPathInfo विधियों के बीच अंतर है?] (http://stackoverflow.com/questions/4931323/whats-the-difference-between-getrequesturi-and-getpathinfo-methods-in-httpservl) – Leonel

उत्तर

124

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

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

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

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

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

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

+0

@ जेसनसी: जैसा कि उत्तर दिया गया है, 'getPathInfo()' वापस लौटाता है यदि फ्रंट नियंत्रक सर्वलेट को उपसर्ग पैटर्न पर मैप नहीं किया गया है। – BalusC

+0

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

2

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

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

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

पढ़ें here

-1

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

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

यदि मैं रूट के रूप में अपना आवेदन तैनात करता हूं और इसका मूल यूआरएल बन जाता है तो इससे समस्या होगी http: // localhost: 8080 /। इस मामले में request.getRequestURI() "/ सुरक्षित/उपयोगकर्ता" लौटाएगा और आपकी विभाजित विधि यहां समस्या का कारण बन जाएगी। कोड तैनाती पर निर्भर नहीं होना चाहिए। – craftsman

60
request.getRequestURI().substring(request.getContextPath().length()) 
+0

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

+4

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

+2

क्या यह उन कामों को लोड-बैलेंसर के रूप में काम करेगा? –

11

getPathInfo(): अभी तक निर्धारित किया है, तो getPathInfo()null लौट सकते हैं), तो आपका सर्वश्रेष्ठ दांव खुद के संदर्भ पथ की लंबाई सामान्य String विधि का उपयोग कर के आधार पर अनुरोध URI सबस्ट्रिंग है। प्रलेखन में 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()); 
    ... 

} 
4

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

इस संक्षिप्त अमान्य बग + प्रतिक्रिया मुद्दा मुझे लगता है कि की ओर संकेत:

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

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

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

19

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

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

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

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