Servlet Filter

Сървлет филтрите са Java класове, които могат да бъдат използвани в Java web програмирането за следните цели :

  • За прихващане на заявки от клиент преди да му се даде достъп до ресурсите в системата;

  • За манипулация на отговорите от сървъра преди те да бъдат изпратени обратно на клиента.

Видове филтри:

  • филтри за аутентикация;

  • филтри за компресия на данни;

  • филтри за кодиране и декодиране;

  • филтри, които управляват достъпа до ресурси;

  • филтри за преобразуване на изображения;

  • филтри за управление на достъпа до системата;

  • верига от филтри за MIME - TYPE;

  • Филтри за токенайзер (обработка на стрингови низове с цел разделяне на поднизове);

  • XSL / Т филтри, които трансформират XML съдържание. За да станат активни и за да се окаже спрямо кой ресурс от уеб приложението те ще работят

Деклариране на филтри:

  • Единият начин за декларация е запис в дескриптора на приложението - web.xml, където се асоциират с дадено сървлет име и URL адрес.

  • Вторият начин за декларация е чрез анотацията @WebFilter

Когато уеб контейнера стартира уеб приложението, той създава инстанция на всеки филтър, който е деклариран в дескриптора. Филтрите се изпълняват в реда, в който са декларирани.

Методи на сървлет филтър

Филтърът е Java клас, който реализира интерфейса javax.servlet.Filter.

Интерфейсът javax.servlet.Filter дефинира методите:

  • public void doFilter (ServletRequest, ServletResponse, FilterChain) - Този метод се извиква от контейнера всеки път при обработка на request/response, в който се изисква достъп до ресурс от клиент;

  • public void init(FilterConfig filterConfig) - Този метод се извиква от уеб контейнера, за да се окаже на филтъра, че е вече активен;

  • public void destroy() - Този метод се извиква от уеб контейнера, за да се окаже на филтъра, че вече не е активен.

Пример:

Servlet филтър, отпечатващ IP адреса на клиенти и текущия час дата:

@WebFilter(urlPatterns = "/CheckBox")
public class LogFilter implements Filter {
	public void init(FilterConfig fConfig) throws ServletException {
        String testParam = fConfig.getInitParameter("test-param");
        System.out.println("Test Param: "+ testParam);
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String ipAddress = request.getRemoteAddr();
        System.out.println("IP "+ipAddress + ", Time " + new Date().toString());
        chain.doFilter(request, response);
    }
}

Анотацията @WebFilter декларира класа, който го съдържа, като сървлет филтър. Параметърът на анотацията - urlPatterns = "/CheckBox") оказва името на сървлета, за който ще бъде приложен филтъра. В зависимост от броя и типа параметри на анотацията има различни случаи на използване на филтрите:

  • филтър работещ за няколко ресурса

@WebFilter(servletNames = {"MyOwnServlet", "UploadServlet"})
public class MyFilter implements Filter {
...
}
  • филтър с инициализиращи параметри

@WebFilter(
 urlPatterns = "/uploadFilter",
 initParams = @WebInitParam(name = "fileTypes", value =
"doc;xls;zip;txt;jpg;png;gif")
)
public class UploadFilter implements Filter {
 ...
}
  • филтър с допълнителна информация

@WebFilter(
 urlPatterns = "/admin/*",
 filterName = "AdminFilter",
 description = "Filter all admin URLs"
)
public class MyFilter implements Filter {
 ...
}
  • филтър с оказване типа на диспечера на обработката

@WebFilter(
 urlPatterns = "/admin",
 dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}
)
public class MyFilter implements Filter {
 ...
}

Last updated