Обработка повторяющихся запросов GET (вызванных Trendmicro) в сервлете Tomcat

1

Какова наилучшая стратегия решения дублирующих запросов GET, поступающих от одного и того же клиента в сервлет Apache Tomcat?

В принципе, то, что я получаю, - это запрос на пару секунд, первый из реального IP-клиента, второй с сервера TrendMicro (похоже, это тот же эффект, что и описанный здесь.

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

Итак, вопрос в том, как я могу заблокировать второй запрос? Или есть ли другая стратегия для решения этой проблемы?

Благодарю!

Теги:
servlets
tomcat

2 ответа

2

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

Сегодня я нашел преступника. Это TrendMicro, отражающий вызов первой записи клиентов между реальным пользователем, просматривающим вторую информацию о клиентах и добавлением комментария. Они также подделывают файл cookie, что является основной проблемой.

То есть. 1) Реальные IP-вызовы Клиент 1 информация (информация сохраняется в сеансе)

2) Реальные IP-звонки Клиентская информация 2 (информация хранится в сеансе, заменяя информацию клиента 1)

3) TrendMicro IP вызывает информацию Customer 1 (информация сохраняется в сеансе, заменяя информацию Customer 2)

4) Реальный IP добавляет комментарий, который добавляется к клиенту, хранящемуся в сеансе, который теперь благодаря TrendMicro является клиентом 1.

Решение? - Я добавил чек, чтобы гарантировать, что мы обслуживаем только звонки, исходящие от зарегистрированного IP-адреса.

Для этого вам нужно сделать 2 вещи.

1) В своем логинном коде после проверки учетных данных для входа в систему сохраните IP-адрес пользователей в сеансе, используя этот код:

session.setAttribute("LoginIPAddress", request.getRemoteAddr());

Затем напишите класс, реализующий интерфейс javax.servlet.Filter.

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpSession;
public class ServletUserAuthenticationFilter implements Filter {


    // ----------------------------------------------------- Instance Variables


    /**
     * The default character forwardTo to set for requests that pass through
     * this filter.
     */
    protected String forwardTo = null;


    /**
     * Take this filter out of service.
     */
    public void destroy() {
        this.forwardTo = null;
    }

    /**
     * Select and set (if specified) the character forwardTo to be used to
     * interpret request parameters for this request.
     *
     * @param request The servlet request we are processing
     * @param result The servlet response we are creating
     * @param chain The filter chain we are processing
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet error occurs
     */
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
    throws IOException, ServletException {

        javax.servlet.http.HttpServletRequest httpRequest = (javax.servlet.http.HttpServletRequest)request;
        HttpSession session = httpRequest.getSession();

        // Is there a valid session?
        // We now also redirect requests if the remote IP Address is not the same address that originally signed in
        if(!httpRequest.getRequestURI().equals(httpRequest.getContextPath()+"/services/login") && !httpRequest.getRequestURI().equals(httpRequest.getContextPath()+"/services/logout")
                && (((session==null || session.getAttribute("userData")==null))
                || (session!=null && session.getAttribute("LoginIPAddress")!=null && !session.getAttribute("LoginIPAddress").equals(httpRequest.getRemoteAddr())))){
            // An Https page has been requested, but no valid session has been found, ao forward the user to the page indicated by forwardTo
            javax.servlet.http.HttpServletResponse httpResponse = (javax.servlet.http.HttpServletResponse)response;
            StringBuffer logonQuery = new StringBuffer();
            logonQuery.append(httpRequest.getScheme());
            logonQuery.append("://");
            logonQuery.append(request.getServerName());
            logonQuery.append(":");
            logonQuery.append(httpRequest.getLocalPort());
            logonQuery.append(httpRequest.getContextPath());
            logonQuery.append(forwardTo);
            session = httpRequest.getSession(true);
            session.setAttribute("MESSAGE", "Your session has expired. Please login again");
            httpResponse.sendRedirect(logonQuery.toString());
            return;
        }

        // Pass control on to the next filter
        chain.doFilter(request, response);

    }


    /**
     * Place this filter into service.
     *
     * @param filterConfig The filter configuration object
     */
    public void init(FilterConfig filterConfig) throws ServletException {

        this.forwardTo = filterConfig.getInitParameter("forwardTo");
    }


}

У меня есть дополнительная проверка этого кода, который вам может не понадобиться, но проверка основного раздела - session.getAttribute("LoginIPAddress"). Equals (httpRequest.getRemoteAddr())

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

  <filter>
    <filter-name>Check User Has Logged In</filter-name>
    <filter-class>au.com.mySystem.utils.filter.ServletUserAuthenticationFilter</filter-class>
    <init-param>
      <param-name>forwardTo</param-name>
      <param-value>/pages/loginForwarder.jsp</param-value>
    </init-param>
  </filter>

Мой код теперь снова работает правильно (нет спасибо TrendMicro)

0

Если ваш сервлет обслуживает запросы напрямую, простой фильтр ограничения скорости сделает трюк - вместо использования сеанса, подобного этому, он будет использовать метод входящих запросов + путь + ip, а затем создать вторую запись для trendmicro ip.

Однако правильные веб-серверы обычно лучше подходят для этого, поэтому, если у вас есть один (например, nginx или apache), я бы посмотрел на это, или вы можете просто заблокировать IP-адрес TrendMicro (если он поступает с одного и того же IP-адреса)

  • 0
    Хорошо, я полагаю, что это правильный подход - хотя это будет означать жесткое кодирование "оскорбительных" IP-адресов Trendmicro. Поскольку эта служба вызывается только зарегистрированными пользователями, я теперь внедрил фильтр, который использует идентификатор пользователя для блокировки повторяющихся запросов, пока первый (реальный) запрос все еще выполняется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню