2010-05-19 3 views
5

Как заблокировать IP-адрес с некоторой конфигурацией на web.xml?Как заблокировать IP-адрес с помощью web.xml?

Нужен ли мне фильтр? Как я могу его реализовать?

+1

Я лично думаю, что это должно быть сделано на уровне администратора на сервере хоста приложения или на сетевом уровне (брандмауэра). –

ответ

6

Вы не можете сделать это чисто по конфигурации в web.xml, нет. Однако сервлет-фильтр был бы хорошим местом для реализации такой вещи.

Интерфейс Filter поставляет HttpServletRequest как часть цепи вызова фильтра, и от того, что вы можете получить IP-адрес клиента (с помощью getRemoteAddr), и сравнить, что в список разрешенных адресов.

Кроме того, ваш конкретный сервер приложений может поддерживать фильтрацию IP-адресов на собственном уровне, но это блокирует вас в этом контейнере (что может или не может быть проблемой для вас).

+0

В tomcat 7 можно надеть web.xml. см. http://www.jvmhost.com/articles/block-ip-address-apache-tomcat-filter –

3

Вы не можете блокировать IP-адреса, используя web.xml. Это должно быть сделано на уровне Webserver, Container или Application Server.

Если вы используете Tomcat, вам необходимо использовать спецификацию Valve для блокировки IP-адресов. Более подробную информацию можно найти, используя следующие ресурсы

http://tomcat.apache.org/tomcat-5.5-doc/config/valve.html

http://hcmc.uvic.ca/blogs/index.php?blog=30&p=2658&more=1&c=1&tb=1&pb=1

2

выяснение конфигурации фильтра и все, что осталось в качестве упражнения для читателя.

import javax.servlet.*; 
import java.io.IOException; 

public class BlackListFilter implements Filter 
{ 
    private String blacklistedip; 

    @Override 
    public void init(final FilterConfig filterConfig) throws ServletException 
    { 
     this.blacklistedip = filterConfig.getInitParameter("blacklistedip"); 
    } 

    @Override 
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain) throws IOException, ServletException 
    { 
     if (!request.getRemoteAddr().equals(this.blacklistedip)) 
     { 
      filterChain.doFilter(request, response); 
     } 
    } 

    @Override 
    public void destroy() 
    { 
     // nothing 
    } 
} 
0

я обычно добиться этого с обратной-прокси веб-сервер, но если вы действительно хотите, чтобы определить его в сервлет, это не проблема ...

Вот пример, чтобы указать вам для управления этим использованием фильтра.

http://www.java2s.com/Code/Java/Servlets/IPFilter.htm

Обратите внимание, что оно не включает в себя записи web.xml, который будет выглядеть примерно так:

<filter> 
     <filter-name>IPFilter</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>IPFilter</filter-name> 
     <servlet-name>MyServlet123</servlet-name> 
    </filter-mapping> 

Если вы используете Spring (как в фильтре класса выше), вы можете использовать Spring DelegatingFilterProxy, чтобы упростить решение, и предоставить вашему фильтру доступ к другим компонентам вашего приложенияContext (потенциально загружать IP-адреса клиентов из свойств или даже базы данных):

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/web/filter/DelegatingFilterProxy.html

НТН