Jak użyć filtra serwletów w Javie, aby zmienić przychodzący adres URL żądania servletów?
Jak mogę użyć filtra servleta, aby zmienić przychodzący adres URL żądania servleta z
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
?
Update: zgodnie z poniższymi krokami Balusca, 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 w web.xml
wygląda tak:
<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 przekierować zarówno po stronie serwera, jak i po stronie klienta z oczekiwanymi rezultatami. Udało się, dzięki BalusC!
3 answers
- implementacja
javax.servlet.Filter
. - W
doFilter()
metoda, rzucać przychodząceServletRequest
naHttpServletRequest
. - użycie
HttpServletRequest#getRequestURI()
aby złapać ścieżkę. - Użyj prostego
java.lang.String
metody takie jaksubstring()
,split()
,concat()
i tak dalej, aby wyodrębnić część zainteresowania i skomponować nową ścieżkę. - użyj albo
ServletRequest#getRequestDispatcher()
i wtedyRequestDispatcher#forward()
aby przesłać żądanie / odpowiedź na nowy adres URL (przekierowanie po stronie serwera, nie odzwierciedlone w pasku adresu przeglądarki), lub rzucają przychodząceServletResponse
naHttpServletResponse
i wtedyHttpServletResponse#sendRedirect()
przekierowanie odpowiedzi na nowy adres URL(przekierowanie po stronie klienta, odzwierciedlone w pasku adresu przeglądarki). - Zarejestruj filtr w
web.xml
naurl-pattern
z/*
lub/Check_License/*
, w zależności od ścieżki kontekstowej, lub jeśli jesteś już na Servlecie 3.0, użyj@WebFilter
zamiast tego adnotacja.
Nie zapomnij dodaj zaznaczenie w kodzie, jeśli URL wymaga zmiany , a jeśli Nie, to po prostu wywołaj FilterChain#doFilter()
, w przeciwnym razie wywoła się w nieskończonej pętli.
Alternatywnie możesz również użyć istniejącego interfejsu API innych firm, aby wykonać całą pracę za Ciebie, na przykład Tuckey 's UrlRewriteFilter , który można skonfigurować tak, jak w przypadku Apache' a mod_rewrite
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 01:34:07
Możesz użyć gotowego do użycia Url Rewrite Filter z regułą taką jak Ta:
<rule>
<from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
<to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 22:22:33
Prosty filtr adresu URL JSF oparty na krokach Odpowiedzi Balusca . Filtr przekazuje wszystkie żądania zaczynające się od ścieżki /ui (przypuśćmy, że masz tam zapisane wszystkie pliki xhtml) do tej samej ścieżki, ale dodając przyrostek XHTML.
public class UrlPrettyfierFilter implements Filter {
private static final String JSF_VIEW_ROOT_PATH = "/ui";
private static final String JSF_VIEW_SUFFIX = ".xhtml";
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
String requestURI = httpServletRequest.getRequestURI();
//Only process the paths starting with /ui, so as other requests get unprocessed.
//You can register the filter itself for /ui/* only, too
if (requestURI.startsWith(JSF_VIEW_ROOT_PATH)
&& !requestURI.contains(JSF_VIEW_SUFFIX)) {
request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
.forward(request,response);
} else {
chain.doFilter(httpServletRequest, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03