Как я могу заблокировать IP-адрес с некоторой конфигурацией на web.xml?
Мне нужен фильтр? Как я могу реализовать тот?
Вы не можете сделать это только через конфигурацию в web.xml
, нет. Однако фильтр сервлетов был бы хорошим местом для реализации такой вещи.
Интерфейс Filter
предоставляет HttpServletRequest
как часть вызова цепочки фильтров, и отсюда вы можете получить IP-адрес клиента (используя getRemoteAddr
) и сравните его со списком разрешенных адресов.
В качестве альтернативы, ваш конкретный сервер приложений может поддерживать фильтрацию IP на частном уровне, но это блокирует вас в этом контейнере (что может быть, а может и не быть проблемой для вас).
Вы не можете блокировать 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
, выясняя конфигурацию фильтра и все, что остается в качестве упражнения для читателя.
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
}
}
Я бы обычно добивался этого с помощью веб-сервера с обратным проксированием, но если вы действительно хотите определить это в своем сервлете, это не проблема ...
Вот пример укажет вам на управление этим с помощью фильтра.
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-адреса клиентов из свойств или даже из базы данных):
hth