Как заблокировать IP-адрес с помощью web.xml? - PullRequest
5 голосов
/ 20 мая 2010

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

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

Ответы [ 4 ]

6 голосов
/ 20 мая 2010

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

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

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

3 голосов
/ 20 мая 2010

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

В случае, если вы используете 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 голосов
/ 20 мая 2010

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

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
    }
}
1 голос
/ 20 мая 2010

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

Вот пример, который поможет вам управлять этим с помощью фильтра.

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, чтобы упростить решение и предоставить вашему фильтру доступ к другим bean-компонентам вашего applicationContext (потенциально загружать клиентские IP-адреса из свойства или даже база данных):

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

НТН

...