كيفية الحصول على عنوان URL للمجال واسم التطبيق؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

هنا السيناريو.

تطبيق الويب الخاص بي Java لديه المسار التالي

https://www.mywebsite.com:9443/MyWebApp

دعنا نقول أن هناك ملف JSP

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp

وأنا بحاجة إلى استرداد

https://www.mywebsite.com:9443/MyWebApp 

ضمن ملف JSP هذا.

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

ولكن هل هناك طريقة ثابارية للقيام بذلك؟ على وجه التحديد، أعتقد أنني أستطيع الحصول على منفذ المجال +، ولكن كيف يمكنني فعلا استرداد اسم التطبيق "mywebappapp"؟

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

المحلول

اسم تطبيق الويب (في الواقع مسار السياق) متاح عن طريق الاتصال HttpServletrequest#getContextPath() (وبالتالي لا getServletPath() كما اقترح واحد من قبل). يمكنك استرداد هذا في JSP بواسطة ${pageContext.request.contextPath}.

<p>The context path is: ${pageContext.request.contextPath}.</p>

إذا كنت تنوي استخدام هذا لجميع المسارات النسبية في صفحة JSP الخاصة بك (والتي من شأنها أن تجعل هذا السؤال أكثر إحساسا)، فيمكنك الاستفادة من HTML <base> بطاقة شعار:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2204870</title>
        <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
        <script src="js/global.js"></script>
        <link rel="stylesheet" href="css/global.css">
    </head>
    <body>
        <ul>
            <li><a href="home.jsp">Home</a></li>
            <li><a href="faq.jsp">FAQ</a></li>
            <li><a href="contact.jsp">Contact</a></li>
        </ul>
    </body>
</html>

جميع الروابط في الصفحة سوف تكون بعد ذلك بالنسبة ل <base> بحيث لا تحتاج إلى coppaste مسار السياق في كل مكان. لاحظ أنه عندما تبدأ الروابط النسبية ب /, ، ثم لن يكونون نسبة إلى <base> بعد الآن، ولكن إلى جذر المجال بدلا من ذلك.

نصائح أخرى

نلقي نظرة على الوثائق ل HttpServletRequest.
من أجل بناء عنوان URL في مثالك، ستحتاج إلى استخدامه:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

فيما يلي طريقة سترجع مثالك:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}

اسم التطبيق يأتي من getContextPath.

أجد هذا الرسم من رشيقة البرمجيات الحرفية httpservletrequest مسار فك التشفير يفرز جميع الأساليب المختلفة المتوفرة:

enter image description here

أود أن أقترح عليك بشدة أن تقرأ من خلال مستندات, ، لطرق مماثلة. إذا كنت مهتما بمسار السياق، فابحث هنا، servletcontext.getcontextpath ().

قد يكون التعليمات البرمجية التالية مفيدة لتطبيق الويب باستخدام JavaScript.

var newURL = window.location.protocol + "//"  + window.location.host + "" + window.location.pathname;

newURL = newURL.substring(0,newURL.indexOf(""));

إذا تم تمرير عنوان URL كسلسلة وترغب في استخراج جذر السياق لهذا التطبيق، فيمكنك استخدام هذا Regex لاستخراجه. ستعمل من أجل عناوين URL كاملة أو عناوين URL النسبية التي تبدأ بجذر السياق.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top