ما هي أفضل طريقة للحصول على عنوان URL الحالي في الربيع MVC؟

StackOverflow https://stackoverflow.com/questions/1490821

  •  18-09-2019
  •  | 
  •  

سؤال

أرغب في إنشاء عناوين URL بناء على عنوان URL المستخدم من قبل العميل للطلب النشط. هل هناك أي شيء أكثر ذكاء من أخذ الحالي HttpServletRequest كائن وهو getParameter...() طرق إعادة إنشاء عنوان URL الكامل بما في ذلك (وفقط) إنها تحصل على المعلمات.

توضيح: إذا كان ذلك ممكنا أريد الاستقالة من استخدام HttpServletRequest هدف.

هل كانت مفيدة؟

المحلول

حسنا، هناك طريقتان للوصول إلى هذه البيانات أسهل، لكن الواجهة لا تقدم إمكانية الحصول على عنوان URL بأكمله مكالمة واحدة. عليك أن تبنيها يدويا:

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

لا أعرف طريقة للقيام بذلك مع أي مرافق MVC الربيع.

إذا كنت ترغب في الوصول إلى الطلب الحالي دون اجتيازه في كل مكان، فسيتعين عليك إضافة مستمع في Web.xml:

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

ثم استخدم هذا للحصول على الطلب ملزمة إلى الخيط الحالي:

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

نصائح أخرى

بدلا من استخدام 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();

يمكن أن يساعدك فئة URI في Java على الخروج من هذا:

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();
}

في ملف JSP:

request.getAttribute("javax.servlet.forward.request_uri")

يمكنك أيضا إضافة UriComponentsBuilder إلى طريقة توقيع طريقة وحدة التحكم الخاصة بك. سيقوم الربيع بحقن مثيل البناء الذي تم إنشاؤه من الطلب الحالي.

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

باستخدام Builder يمكنك البدء مباشرة في إنشاء URIS بناء على الطلب الحالي، مثل تعديل شرائح المسار.

أنظر أيضا uricomponentsbuildermethodargumentResolver.

إذا كنت بحاجة إلى عنوان URL حتى اسم المضيف وليس المسار استخدام ليب أباتشي المشترك StringUtil, من وإلى URL استخراج السلاحيات حتى الفكرية الثالثة /.

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

مثال: إذا fullurl يكون https://example.com/path/after/url/ ومن بعدانتاج | سوف يكون https://example.com

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top