HttpServlet получает 2 запроса для каждого вызова ajax

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: на самом деле я использовал log4j, и он не был хорошо настроен, заставляя его дважды регистрировать каждый LOGGER.debug ();

Я не могу понять, почему мой сервлет получает 2 запроса на каждый вызов ajax, отправляемый моим интерфейсом.

Я запускаю свой сервлет с Tomcat.

Моя System.out.println () выводит «Hello» два раза, когда я подключаюсь к интерфейсу.

Я проверял несколько раз с помощью F12 в Firefox, я отправляю только один запрос ajax с параметром action = register.

Мой HttpServlet:

@WebServlet(name = "MyServlet", urlPatterns = { "/actions" })

public class MyServlet extends HttpServlet {

private static final long serialVersionUID = -983728805534985870L;



public MyServlet() {

}



protected void doPost(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

    response.setHeader("Access-Control-Allow-Origin", "*");

    response.setHeader("Access-Control-Allow-Methods", "GET,POST");

    response.setCharacterEncoding("UTF-8");

    response.setContentType("text/html");



    switch (request.getParameter("action")) {

    case "call":

        callAction(request, response);

        break;

    case "register":

        System.out.println("Hello");

        register(request, response);

        break;

    case "unregister":

        unregister(request, response);

        break;

    }

}



private void callAction(HttpServletRequest request, HttpServletResponse response) {

    /*
    ...
    */

}

private void register(HttpServletRequest request, HttpServletResponse response) {

    String connectedUserNumber = request.getParameter("number");

    String uniqueID = agentUCC.register(connectedUserNumber);

    LOGGER.debug("Register request from " + request.getRemoteAddr() + " with phone number " + connectedUserNumber);

    LOGGER.info("User with phone number [{}] has been connected with uniqueID [{}]", connectedUserNumber, uniqueID);

    handleSuccess(response, uniqueID);

}



private void unregister(HttpServletRequest request, HttpServletResponse response) {

    /*
    ...
    */

}



// utility method - avoid code redundancy

private void handleSuccess(HttpServletResponse response, String message) {

    response.setStatus(HttpServletResponse.SC_OK);

    response.setHeader("Access-Control-Allow-Origin", "*");

    try {

        response.getWriter().print(message);

    } catch (IOException e) {

        LOGGER.error("ERROR : {}", e.getMessage(), e);

    }

}

}

Я тестирую это с помощью простого интерфейса:

    <!doctype html>
<html>
<head>
  <meta charset = "utf-8">
</head>
<body>
    <!--  This will be displayed first. When the user isn't logged yet. -->
    <div id = "connectionPage">
        <h2>Connection</h2>
        <br/>
        <p>Your phone number :</p>
        <input type = "text" id = "connectionNumber"/>
        <br/><br/>
        <input type = "button" value = "Connect" id = "connect"/>
        <br/>
        <p id = "connectionError"></p>
    </div>

    <!-- 
        ...
    -->

    <script src = "resources/js/jquery-3.3.1.min.js"></script>
    <script src = "resources/js/script.js"></script>
</body>
</html>

и мой script.js:

$(function() {
    var connectedUserNumber;    
    // session's ID
    var uniqueID;

    // Connection
    $("#connect").click(function(){
        connectedUserNumber = $("#connectionNumber").val();
        register();
    });

    // Register to the back-end
    function register(){
        console.info("Register !");
        $.ajax({
            xhrFields: {
                withCredentials: false
            },
            type: 'POST',
            url: 'foo/actions',
            data: 'action=register&number=' + connectedUserNumber,
            datatype: 'text',
            success: function(data) {
                uniqueID = data;
                doPoll();
            },
            error: function(jqXHR, textStatus, exception) {
               /*
            ...
           */
            }
        });
    }

    // Send every 2 seconds an ajax's request to retrieve incoming call's notifications
    function doPoll() {
        $.ajax({
            type: 'POST',
            url: 'foo/actions',
            data: 'action=getNotificationToPush&uniqueID=' + uniqueID,
            datatype: 'json',
            success: function(data) {
                handleDoPollSuccess(data);
            },
            error: function(jqXHR, textStatus, exception) {
                handleEventError(jqXHR, textStatus, exception);
            }
        }).always(function() {
            // Waits 2 seconds before sending the next request
            setTimeout(doPoll, 2000);
        });
    }
    /*
    ...
       */
});

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

Обновлено: я ctrl + f + «register ()» в моем JS-файле, и единственное место, где я вызываю этот метод, - это строка 9. Я бы все равно видел этот второй вызов ajax в моей консоли отладки Firefox.

Edit bis: оба запроса принимаются с одинаковой тысячной долей секунды. (Например: оба получены в 14: 40: 30: 859)

Другой пользователь спрашивает, как обрабатывать вторые запросы от TrendMicro, инфраструктуры безопасности. У вас в стеке есть что-нибудь подобное? stackoverflow.com/questions/28353652/…

Jan Larsen 10.04.2018 15:54

Нет, абсолютно нет. Я добавил деталь: оба запроса принимаются за одну тысячную секунды. (Например: оба получены в 14: 40: 30: 859)

Gabriel 10.04.2018 16:01

Вы уверены, что это не просто запрос OPTIONS? Я имею в виду, что в твоей JS-консоли? Довольно легко увидеть, что отправляется из браузера.

Dave Newton 10.04.2018 16:05

connect также кнопка отправки?

user7294900 10.04.2018 16:07

@DaveNewton Я не уверен, что такое запрос OPTIONS ... Мой вызов ajax использует запрос POST.

Gabriel 10.04.2018 16:21

@ user7294900 Нет, ничего не отправляет. Хорошая попытка!

Gabriel 10.04.2018 16:22

Что в вашей консоли JS для запросов? Ajax отправляет предполетный запрос.

Dave Newton 10.04.2018 16:49

ваша кнопка подключения по какой-то причине нажимается дважды

Jonathan Laliberte 10.04.2018 18:18

@JonathanLaliberte Если дважды щелкнуть по нему, он появится в сетевой консоли отладки Firefox. Верно?

Gabriel 10.04.2018 18:31

Да, вы должны увидеть два запроса к сервлету в представлении «Сеть». И если вы этого не видите, то единственное возможное объяснение состоит в том, что вы делаете что-то странное на стороне сервера. Например, вы пытались удалить оператор переключения регистра? А как насчет того, чтобы не использовать метод handleSuccess?

Jonathan Laliberte 10.04.2018 18:36

@JonathanLaliberte Да, хорошая идея, завтра попробую и дам знать;)

Gabriel 10.04.2018 20:22

@JonathanLaliberte Хорошо, я выяснил, в чем была моя проблема. Я не использовал System.out.println. На самом деле я использовал log4j. Мой log4j.properties не был хорошо настроен, из-за чего он дважды регистрировал каждое действие.

Gabriel 11.04.2018 09:59

Имеет смысл. Рад слышать, что ты в этом разобрался. Удачного кодирования!

Jonathan Laliberte 11.04.2018 10:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
13
32
0

Другие вопросы по теме