Фильтр используется в качестве контроллера в Struts2 - PullRequest
6 голосов
/ 17 марта 2012

В struts2 Почему фильтр используется в качестве контроллера вместо ActionServlet?

В чем преимущество использования фильтра перед ActionServlet?

Ответы [ 2 ]

5 голосов
/ 22 июля 2013

Согласно книге 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

0 голосов
/ 17 марта 2012

Обычно мы используем фильтр, когда хотим отфильтровать и / или изменить запросы в зависимости от конкретных условий. Чтобы S2 работал, ему необходимо выполнить определенную работу по переработке и модификации, чтобы успешно выполнить ваш запрос, в то время как в других руках мы используем сервлет, когда мы хотим контролировать, предварительно обрабатывать и / или обрабатывать запросы.

Для управления запросом S2 используйте сервлет под капотом, но он скрыт, чтобы сделать общую структуру приложения более чистой и простой в использовании.

Это то, что мы имеем для фильтров в Java EE 6 Tutorial .

Фильтр - это объект, который может преобразовывать заголовок и содержимое (или оба) запроса или ответа. Фильтры отличаются от веб-компонентов тем, что сами фильтры обычно не создают ответ. Вместо этого фильтр обеспечивает функциональность, которую можно «прикрепить» к любому веб-ресурсу. Следовательно, фильтр не должен иметь никаких зависимостей от веб-ресурса, для которого он выступает в качестве фильтра; таким образом, он может быть составлен из более чем одного типа веб-ресурса.

...