Jak mogę użyć filtra serwletu do zmiany przychodzącego adresu URL żądania serwletu
http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123
do
http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123
?
Aktualizacja : zgodnie z poniższymi krokami BalusC, wymyśliłem następujący kod:
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() {
//
}
}
Odpowiedni wpis web.xml
wygląda następująco:
<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>
Próbowałem przekierowania zarówno po stronie serwera, jak i klienta z oczekiwanymi wynikami. Udało się, dzięki BalusC!
Odpowiedzi:
javax.servlet.Filter
.doFilter()
metodzie rzutuj przychodząceServletRequest
naHttpServletRequest
.HttpServletRequest#getRequestURI()
aby złapać ścieżkę.java.lang.String
metod, takich jaksubstring()
,split()
,concat()
i tak dalej, aby wyodrębnić część odsetek i komponować nową ścieżkę.ServletRequest#getRequestDispatcher()
a następnie,RequestDispatcher#forward()
aby przekazać żądanie / odpowiedź na nowy adres URL (przekierowanie po stronie serwera, nie odzwierciedlone w pasku adresu przeglądarki), lub przesłać przychodząceServletResponse
na,HttpServletResponse
a następnieHttpServletResponse#sendRedirect()
przekierować odpowiedź na nowy adres URL (przekierowanie po stronie klienta, odzwierciedlone w pasek adresu przeglądarki).web.xml
na zasadzieurl-pattern
z/*
lub/Check_License/*
, w zależności od ścieżki kontekstu, lub jeśli jesteś na Servlet 3.0 już, użyj@WebFilter
adnotacji na tym, że zamiast.Nie zapomnij dodać zaznaczenia w kodzie, jeśli adres URL wymaga zmiany, a jeśli nie , to po prostu zadzwoń
FilterChain#doFilter()
, inaczej zadzwoni sam w nieskończonej pętli.Alternatywnie możesz również użyć istniejącego interfejsu API innej firmy, aby wykonać całą pracę za Ciebie, takiego jak UrlRewriteFilter Tuckeya, który można skonfigurować tak, jak w przypadku Apache
mod_rewrite
.źródło
RequestDispatcher#forward()
jest wykonywany, reszta filtrów nie zostanie wykonana. Czy to nie będzie lepszy sposób niż robienie tego jako serwlet?<dispatcher>FORWARD</dispatcher>
do mapowania filtrów.<dispatcher>FORWARD</dispatcher>
do mapowania filtrów.Możesz użyć gotowego do użycia filtra przepisywania adresów URL z następującą regułą:
Sprawdź przykłady, aby uzyskać więcej ... przykładów.
źródło
Prosty filtr JSF Url Prettyfier oparty na odpowiedziach BalusC . Filtr przekazuje wszystkie żądania zaczynające się od ścieżki / ui (zakładając, że masz tam zapisane wszystkie pliki xhtml) do tej samej ścieżki, ale dodając przyrostek xhtml.
źródło