Bagaimana saya bisa menggunakan filter servlet untuk mengubah url permintaan servlet masuk
http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123
untuk
http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123
?
Pembaruan : menurut langkah-langkah BalusC di bawah ini, saya membuat kode berikut:
public class UrlRewriteFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
//
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getRequestURI();
if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
String newURI = requestURI.replace(toReplace, "?Contact_Id=");
req.getRequestDispatcher(newURI).forward(req, res);
} else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
//
}
}
Entri yang relevan web.xml
terlihat seperti ini:
<filter>
<filter-name>urlRewriteFilter</filter-name>
<filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>urlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Saya mencoba pengalihan sisi server dan sisi klien dengan hasil yang diharapkan. Berhasil, terima kasih BalusC!
Jawaban:
javax.servlet.Filter
.doFilter()
metode, masukkan yang masukServletRequest
keHttpServletRequest
.HttpServletRequest#getRequestURI()
untuk mengambil jalan.java.lang.String
metode sepertisubstring()
,split()
,concat()
dan sebagainya untuk mengekstrak bagian dari bunga dan menyusun jalan baru.ServletRequest#getRequestDispatcher()
dan kemudianRequestDispatcher#forward()
untuk meneruskan permintaan / tanggapan ke URL baru (pengalihan sisi-server, tidak tercermin di bilah alamat browser), atau masukkan yang masukServletResponse
keHttpServletResponse
dan kemudianHttpServletResponse#sendRedirect()
untuk mengarahkan tanggapan ke URL baru (pengalihan sisi klien, tercermin dalam bilah alamat browser).web.xml
padaurl-pattern
dari/*
atau/Check_License/*
, tergantung pada jalur konteks, atau jika Anda berada di Servlet 3.0 sudah, gunakan@WebFilter
penjelasan untuk itu sebagai gantinya.Jangan lupa untuk menambahkan tanda centang pada kode jika URL perlu diubah dan jika tidak , maka panggil saja
FilterChain#doFilter()
, kalau tidak maka akan memanggil dirinya sendiri dalam loop tak terbatas.Atau Anda juga dapat menggunakan API pihak ke-3 yang ada untuk melakukan semua pekerjaan untuk Anda, seperti UrlRewriteFilter Tuckey yang dapat dikonfigurasi dengan cara seperti yang akan Anda lakukan dengan Apache
mod_rewrite
.sumber
RequestDispatcher#forward()
dieksekusi, sisa filter tidak akan dieksekusi. Jadi, bukankah cara yang lebih baik untuk melakukan ini sebagai servlet?<dispatcher>FORWARD</dispatcher>
ke filter filter.<dispatcher>FORWARD</dispatcher>
ke filter filter.Anda dapat menggunakan Filter Url Rewrite yang siap digunakan dengan aturan seperti ini:
Periksa Contoh untuk lebih banyak ... contoh.
sumber
Filter JSF Url Prettyfier sederhana yang didasarkan pada langkah-langkah jawaban BalusC . Filter meneruskan semua permintaan yang dimulai dengan jalur / ui (seandainya Anda memiliki semua file xhtml Anda yang tersimpan di sana) ke jalur yang sama, tetapi menambahkan akhiran xhtml.
sumber