Bagaimana cara mendapatkan URL domain dan nama aplikasi?

98

Berikut skenarionya.

Aplikasi web Java saya memiliki jalur berikut

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

Katakanlah ada file JSP

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

dan saya perlu mengambil

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

dalam file JSP ini.

Tentu saja, ada cara yang agak malas dan konyol untuk mendapatkan URL dan kemudian menelusuri ulang jalurnya kembali.

Tetapi apakah ada cara terprogram untuk melakukan ini? Secara khusus, saya rasa saya bisa mendapatkan domain + port, tapi bagaimana cara saya mendapatkan kembali nama aplikasi "MyWebApp"?

ericbae
sumber

Jawaban:

91

Nama aplikasi web (sebenarnya path konteks) tersedia dengan memanggil HttpServletrequest#getContextPath()(dan BUKAN getServletPath()seperti yang disarankan sebelumnya). Anda dapat mengambilnya di JSP dengan ${pageContext.request.contextPath}.

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

Jika Anda ingin menggunakan ini untuk semua jalur relatif di laman JSP Anda (yang akan membuat pertanyaan ini lebih masuk akal), Anda dapat menggunakan <base>tag HTML :

<%@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>

Semua link di halaman akan secara otomatis menjadi relatif terhadap <base>sehingga Anda tidak perlu menyalin ulang jalur konteks di mana pun. Perhatikan bahwa ketika tautan relatif dimulai dengan a /, maka tautan tersebut tidak akan lagi menjadi relatif dengan the <base>, melainkan ke akar domain.

BalusC
sumber
Doc menyatakan, "Jalur konteks yang dikembalikan oleh ServletContext.getContextPath() harus dianggap sebagai jalur konteks utama atau pilihan aplikasi". Itulah alasan saya memasukkan yang ini ke jawaban asli saya, setelah menyadarinya. Saya tidak menghapus upaya pertama saya, karena saya ingin OP mempertimbangkan membaca dokumen dan mengetahui lebih banyak tentang metode terkait. Saya harap Anda mengerti maksud saya.
Adeel Ansari
@Vinegar: Untuk file JSP, getServletPath()pengembaliannya /filename.jsp. OP tidak meminta itu sama sekali, ini jelas bukan cara yang tepat.
BalusC
Saya pasti akan melakukan koreksi dalam posting saya, tetapi kali ini saya mengharapkan tanggapan atas komentar saya, yang sama sekali berbeda :).
Adeel Ansari
2
Dalam XHTML DOCTYPE, Anda perlu menambahkan karakter '/' ke contextPath. <base href = "$ {pageContext.request.contextPath} /">
Basil Musa
Mengapa Anda tidak menutup <base>tag? Bukankah semua tag harus ditutup?
Fabiano Francesconi
107

Lihat dokumentasi untuk HttpServletRequest.
Untuk membuat URL dalam contoh Anda, Anda perlu menggunakan:

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

Berikut adalah metode yang akan mengembalikan contoh Anda:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
Jataro
sumber
1
bagaimana cara mendapatkan ip jika nama server adalah localhost?
Mahmoud Saleh
hanya catatan singkat, getScheme () tidak selalu berfungsi untuk https, beberapa server memiliki perilaku aneh dan mungkin selalu mengembalikan http, bukan https. Saya pikir saya harus memberi tahu Anda. coba request.getRequestURL (). toString () dan pijat jika Anda membutuhkan
K ''
1
@MahmoudSalehrequest.getLocalAddr()
kebiru
Akan lebih baik jika Anda juga menampilkan contoh keluaran untuk masing-masing metode. Sungguh menyakitkan untuk mengaktifkan server web dan menjalankan hanya untuk memeriksa apa output dari masing-masing mungkin.
Jus12
1
getContextPath()dalam metode ini tidak mengembalikan apapun! Dan getServerPort()hanya mengembalikan angka 2 digit, bukan angka 4 digit! Bisakah saya membantu?
sam
22

Nama aplikasi berasal getContextPath.

Saya menemukan grafik ini dari Agile Software Craftsmanship HttpServletRequest Path Decoding memilah semua metode berbeda yang tersedia:

masukkan deskripsi gambar di sini

AgilePro
sumber
1
Grafik ini berguna untuk menjawab banyak pertanyaan. Saya telah mencoba menggunakannya untuk menjawab banyak pertanyaan, tetapi semuanya dihapus: ada aturan yang melarang penggunaan ulang jawaban yang sama. Memalukan. Teorinya adalah jika Anda menggunakan jawaban yang sama, maka pertanyaannya harus sama, dan untuk itu Anda harus menandai pertanyaan tersebut sebagai duplikat. Tapi itu bukanlah kenyataan. Ada banyak pertanyaan berbeda yang bisa dijawab dengan grafik yang sama. Itu berpikiran kecil untuk menerapkan aturan sewenang-wenang seperti itu. Jika ANDA melihat pertanyaan yang paling baik dijawab dengan grafik ini, silakan gunakan.
AgilePro
7

Saya sangat menyarankan Anda untuk membaca dokumen , untuk metode serupa. Jika Anda tertarik dengan jalur konteks, lihat di sini, ServletContext.getContextPath () .

Adeel Ansari
sumber
4

Kode berikut mungkin berguna untuk aplikasi web menggunakan JavaScript.

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

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

Jika Anda sedang melewati url sebagai String dan ingin mengekstrak akar konteks dari aplikasi itu, Anda dapat menggunakan regex ini untuk mengekstraknya. Ini akan berfungsi untuk url lengkap atau url relatif yang dimulai dengan akar konteks.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
master_d
sumber