ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: на самом деле я использовал 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)
Нет, абсолютно нет. Я добавил деталь: оба запроса принимаются за одну тысячную секунды. (Например: оба получены в 14: 40: 30: 859)
Вы уверены, что это не просто запрос OPTIONS? Я имею в виду, что в твоей JS-консоли? Довольно легко увидеть, что отправляется из браузера.
connect также кнопка отправки?
@DaveNewton Я не уверен, что такое запрос OPTIONS ... Мой вызов ajax использует запрос POST.
@ user7294900 Нет, ничего не отправляет. Хорошая попытка!
Что в вашей консоли JS для запросов? Ajax отправляет предполетный запрос.
ваша кнопка подключения по какой-то причине нажимается дважды
@JonathanLaliberte Если дважды щелкнуть по нему, он появится в сетевой консоли отладки Firefox. Верно?
Да, вы должны увидеть два запроса к сервлету в представлении «Сеть». И если вы этого не видите, то единственное возможное объяснение состоит в том, что вы делаете что-то странное на стороне сервера. Например, вы пытались удалить оператор переключения регистра? А как насчет того, чтобы не использовать метод handleSuccess?
@JonathanLaliberte Да, хорошая идея, завтра попробую и дам знать;)
@JonathanLaliberte Хорошо, я выяснил, в чем была моя проблема. Я не использовал System.out.println. На самом деле я использовал log4j. Мой log4j.properties не был хорошо настроен, из-за чего он дважды регистрировал каждое действие.
Имеет смысл. Рад слышать, что ты в этом разобрался. Удачного кодирования!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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