स्प्रिंग एमवीसी में वर्तमान URL प्राप्त करने का सबसे अच्छा तरीका क्या है?


95

मैं सक्रिय अनुरोध के लिए क्लाइंट द्वारा उपयोग किए गए URL के आधार पर URL बनाना चाहता हूं। क्या वर्तमान HttpServletRequestवस्तु को लेने की तुलना में अधिक स्मार्ट है और यह getParameter...()संपूर्ण URL को फिर से बनाने के लिए तरीके हैं (और केवल) यह GET पैरामीटर है।

स्पष्टीकरण: यदि संभव हो तो मैं एक HttpServletRequestवस्तु का उपयोग करके इस्तीफा देना चाहता हूं ।

जवाबों:


111

वैसे इस डेटा को आसानी से एक्सेस करने के दो तरीके हैं, लेकिन इंटरफ़ेस एक कॉल के साथ पूरे URL को प्राप्त करने की संभावना प्रदान नहीं करता है। आपको इसे मैन्युअल रूप से बनाना होगा:

public static String makeUrl(HttpServletRequest request)
{
    return request.getRequestURL().toString() + "?" + request.getQueryString();
}

मैं किसी भी स्प्रिंग एमवीसी सुविधाओं के साथ ऐसा करने के तरीके के बारे में नहीं जानता।

यदि आप वर्तमान अनुरोध को हर जगह पारित किए बिना एक्सेस करना चाहते हैं, तो आपको web.xml में एक श्रोता जोड़ना होगा:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

और फिर वर्तमान थ्रेड के लिए अनुरोध प्राप्त करने के लिए इसका उपयोग करें:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()

ठीक है, यह एक समान दृष्टिकोण है जो मैंने अब तक किया है। लेकिन मैं वास्तव में HttpServletRequestवस्तु का उपयोग किए बिना ऐसा करने का एक तरीका खोज रहा हूं । ऐसा इसलिए है क्योंकि मैं कई सहायक वर्गों / विधियों का उपयोग कर रहा हूं और मैं हर बार अनुरोध ऑब्जेक्ट पास नहीं करना चाहता।
कोरकटोर

ठीक है, मुझे पता है कि आपका क्या मतलब है और उस जानकारी को जोड़ा है जिसे आपको वर्तमान अनुरोध के बिना इसे पास करने की आवश्यकता है।
दफ सिप

श्रोता के बारे में अनुस्मारक के लिए धन्यवाद। मैं अभी भी स्प्रिंग (और सामान्य रूप से जावा वेब विकास) में नया हूँ। मैं अब स्प्रिंग सिक्योरिटी के साथ आपके कोड का उपयोग कर रहा हूं UrlUtils। एक जादू की तरह काम करता है।
कोरकटोर

मेरे मामले में यह ब्राउज़ url के बजाय संबंधित दृश्य पथ देता है। इस बारे में कोई विचार?
Md। शौगत हुसैन 16

76

RequestContextHolderसीधे उपयोग करने के बजाय , आप ServletUriComponentsBuilderइसका उपयोग कर सकते हैं और इसके स्थैतिक तरीके:

  • ServletUriComponentsBuilder.fromCurrentContextPath()
  • ServletUriComponentsBuilder.fromCurrentServletMapping()
  • ServletUriComponentsBuilder.fromCurrentRequestUri()
  • ServletUriComponentsBuilder.fromCurrentRequest()

वे RequestContextHolderहुड के तहत उपयोग करते हैं, लेकिन क्षमताओं के उपयोग से नए URL बनाने के लिए अतिरिक्त लचीलापन प्रदान करते हैं UriComponentsBuilder

उदाहरण:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();

@ m4rtin मैंने अपने प्रश्न का उत्तर दिया और उस व्यक्ति का श्रेय नहीं लेना चाहता जिसने शुरुआत में मेरी समस्या को हल करने में मदद की।
कोराकटोर

2
इसके अलावा अच्छा वसंत 5. के लिए मैं एक अंदर URL प्राप्त करने प्रबंधित किया है ConstraintValidatorके साथ ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();
गाइटर

16

जावा का URI क्लास इसमें आपकी मदद कर सकता है:

public static String getCurrentUrl(HttpServletRequest request){
    URL url = new URL(request.getRequestURL().toString());
    String host  = url.getHost();
    String userInfo = url.getUserInfo();
    String scheme = url.getProtocol();
    String port = url.getPort();
    String path = request.getAttribute("javax.servlet.forward.request_uri");
    String query = request.getAttribute("javax.servlet.forward.query_string");

    URI uri = new URI(scheme,userInfo,host,port,path,query,null)
    return uri.toString();
}

केवल होस्टनाम दे रहा है
vivex


3

आप UriComponentsBuilderअपने नियंत्रक विधि के विधि हस्ताक्षर में भी जोड़ सकते हैं । वसंत वर्तमान अनुरोध से निर्मित बिल्डर के एक उदाहरण को इंजेक्ट करेगा।

@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
    URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
            .replacePath(null)
            .replaceQuery(null)
            .pathSegment("some", "new", "path")
            .build().toUri();
  //...
}

बिल्डर का उपयोग करके आप सीधे मौजूदा अनुरोधों के आधार पर URI बनाना शुरू कर सकते हैं जैसे कि पथ खंडों को संशोधित करें।

UriCompordsBuilderMethodArgumentResolver भी देखें


ध्यान दें कि इंजेक्शन UriComponentsBuilderमें अनुरोध के पथ और क्वेरी पैरामीटर शामिल नहीं हैं। यदि आपको उन लोगों तक पहुँचने की आवश्यकता है जो या तो उपयोग करते हैं ServletUriComponentsBuilder.fromCurrentRequest()या उपयोग करने के लिए एक इंजेक्शन लगाते HttpServletRequestहैंServletUriComponentsBuilder.fromRequest(request)
मार्टिन डेविलर्स

-1

यदि आपको होस्टनाम तक URL की आवश्यकता है, न कि पथ अपाचे के कॉमन लिब का उपयोग करें StringUtil, और URL से तीसरे इंडेक्सऑफ तक सबस्ट्रिंग को निकालें /

public static String getURL(HttpServletRequest request){
   String fullURL = request.getRequestURL().toString();
   return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3)); 
}

उदाहरण: अगर फुलुर है https://example.com/path/after/url/तो आउटपुट होगा https://example.com

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