Metode request.getRequestURI () mengembalikan URI dengan jalur konteks.
Misalnya, jika URL dasar dari sebuah aplikasi adalah http://localhost:8080/myapp/
(yaitu jalur konteks adalah myapp ), dan saya sebut request.getRequestURI()
untuk http://localhost:8080/myapp/secure/users
, itu akan kembali /myapp/secure/users
.
Adakah cara agar kita hanya bisa mendapatkan bagian ini /secure/users
, yaitu URI tanpa jalur konteks?
Jawaban:
Jika Anda berada di dalam servlet contoller depan yang dipetakan pada pola awalan, maka Anda dapat menggunakan
HttpServletRequest#getPathInfo()
.Dengan asumsi bahwa servlet dalam contoh Anda dipetakan
/secure
, maka ini akan mengembalikan/users
yang akan menjadi informasi yang menjadi kepentingan tunggal di dalam servlet pengontrol depan yang khas.Namun, jika servlet dipetakan pada pola sufiks (contoh URL Anda tidak menunjukkan bahwa ini masalahnya), atau ketika Anda benar-benar berada di dalam filter (ketika servlet yang akan dipanggil belum ditentukan, jadi
getPathInfo()
dapat kembalinull
), maka taruhan terbaik Anda adalah membuat substring URI permintaan sendiri berdasarkan panjang jalur konteks menggunakanString
metode biasa :sumber
getServletPath()
? Saya sedang menulis filter dan saya perhatikan bahwagetPathInfo()
mengembalikannull
, tetapigetServletPath()
mengembalikan jalur tanpa konteks (cocok untuk meneruskan ke dispatcher permintaan).getPathInfo()
mengembalikan null jika servlet pengontrol depan tidak dipetakan pada pola awalan./foo.xhtml
bukan/foo.jsf
) dan bukan URI permintaan sebenarnya (yang akan dilihat pengguna akhir di bilah alamat browser). Jalur servlet asli dalam kasus seperti itu namun dapat diselesaikan sebagai atribut permintaan dengan kunciRequestDispatcher.FORWARD_SERVLET_PATH
. Dengan cara apa pun, pertanyaan tersebut secara eksplisit meminta URI permintaan (seperti di bilah alamat browser), jadi jawabannya didasarkan pada itu.sumber
Dengan Spring, Anda dapat melakukan:
sumber
getPathInfo () terkadang mengembalikan null. Dalam dokumentasi HttpServletRequest
Saya perlu mendapatkan jalur ke file tanpa jalur konteks di Filter dan getPathInfo () mengembalikan saya null. Jadi saya menggunakan metode lain: httpRequest.getServletPath ()
sumber
Jika Anda menggunakan request.getPathInfo () di dalam Filter, Anda sepertinya selalu mendapatkan null (setidaknya dengan jetty).
Bug + respons singkat yang tidak valid ini menyinggung masalah yang menurut saya:
https://issues.apache.org/bugzilla/show_bug.cgi?id=28323
Saya menduga ini terkait dengan fakta bahwa filter dijalankan sebelum servlet mendapat permintaan. Ini mungkin bug kontainer, atau perilaku yang diharapkan yang belum dapat saya identifikasi.
ContextPath tersedia, jadi solusi fforws bekerja bahkan dalam filter. Saya tidak suka melakukannya dengan tangan, tetapi implementasinya rusak atau
sumber
Cara untuk melakukannya adalah dengan menghentikan jalur konteks servelet dari URI permintaan.
Baca disini .
sumber
Mungkin Anda bisa menggunakan metode split untuk menghilangkan '/ myapp' misalnya:
sumber