Я использую
<url-pattern>/*</url-pattern>
чтобы отобразить все запросы на один sevlet, где я выполняю всю работу по аутентификации. но я хочу пропустить некоторый статический контент (например, css файлы). Так что я пробовал их этот sevlet, где находится файл ресурсов
if(isResourceFile){
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("static/" + fileName);
dispatcher.forward(request, response);
}
но это запустит бесконечный цикл, потому что это снова вызовет тот же sevlet
Есть ли способ обойти это без сопоставления всех файлов ресурсов (css) в web.xml?
Предполагая, что вы хотите аутентифицировать только JSP файлы, вы можете изменить URL-адрес:
/*.jsp
Я думаю, что лучше справиться с вашей проверкой подлинности, используя фильтр, а не сервлет. И в производственной среде вы должны использовать внешний сервер для статического контента.
url-pattern
/*
лучше использовать исключительно Filter
s, а не Servlet
s. Поместите все ваши статические файлы в определенную папку (возможно, она покрыта url-pattern
более эффективного FileServlet?), И пусть фильтр проверьте его.
например. (Псевдо)
public void doFilter(request, response, chain) {
if (requestURI.startsWith("/static")) {
chain.doFilter(request, response); // Just continue. Do nothing.
} else {
request.getRequestDispatcher("/pages").forward(request, response); // Forward to page controller.
}
}
Надеюсь, что это поможет.
Если вы не можете использовать фильтр, и вы должны использовать подстановочный знак '*' в сопоставлении без расширения типа ".jsp", тогда это может сработать для вас:
if(isResourceFile){
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/static/" + fileName);
dispatcher.forward(request, response);
return;
}
Добавление '/' в начале статического каталога даст ему корневой контекст.