Согласно книге Struts2 Budi Karnival struts2, есть одно явное преимущество использования фильтра над сервлетом в качестве контроллера. С помощью фильтра вы можете удобно выбрать обслуживание всех ресурсов вашего приложения, включая статические.
С помощью сервлета ваш контроллер обрабатывает только доступ к динамической части приложения. Обратите внимание, что элементом url-pattern в файле web.xml в предыдущем приложении является
<servlet>
<servlet-name>Controller</servlet-name>
<servlet-class>...</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Controller</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
При такой настройке запросы статических ресурсов обрабатываются не контроллером сервлета, а контейнером. Вы не захотите обрабатывать статические ресурсы в контроллере сервлета, потому что это потребует дополнительной работы.
Фильтр другой. Фильтр может пропустить запросы на статическое содержимое. Чтобы передать запрос, вызовите метод filterChain.doFilter в методе фильтра doFilter.
Следовательно, использование фильтра в качестве контроллера позволяет блокировать все запросы к приложению, включая запросы на статическое содержимое. После этого в вашем дескрипторе развертывания появится следующая настройка:
<filter>
<filter-name>filterDispatcher</filter-name>
<filter-class>...</filter-class>
</filter>
<filter-mapping>
<filter-name>filterDispatcher</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Преимущество этого фильтра: одна вещь наверняка, вы можете легко защитить ваши статические файлы от любопытных глаз.
Следующий код отправит сообщение об ошибке, если пользователь попытается просмотреть файл JavaScript:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String uri = req.getRequestURI();
if (uri.indexOf("/css/") != -1 && req.getHeader("referer") == null) {
res.sendError(HttpServletResponse.SC_FORBIDDEN);
} else {
// handle this request
}
}
Он не защитит ваш код от самых решительных людей, но пользователи больше не смогут вводить URL-адрес вашего статического файла для просмотра. Таким же образом вы можете защитить свои изображения, чтобы никто не мог ссылаться на них за ваш счет.
Еще одно преимущество:
Внедрение Interceptors в инфраструктуру Struts2. Это не только сокращает наши усилия по написанию кода, но и помогает нам писать любой код, который мы бы использовали фильтры для кодирования и необходимые изменения в web.xml, в отличие от Struts1.Так теперь любой код который лучше подходит для фильтра, теперь может быть перемещен на перехватчики (которые более управляемы, чем фильтры), всей конфигурацией можно управлять в файле struts.xml, не нужно трогать файл web.xml