AJAX Post запрос к удаленному tomcat возвращает 415 - PullRequest
0 голосов
/ 04 февраля 2019

Моя проблема в том, что каждый POST-запрос, отправленный с AJAX, возвращает ошибку 415 при использовании удаленного tomcat, размещенного на виртуальной машине Debian 9.Тот же код прекрасно работает для локального кота (та же версия, без разницы в файлах конфигурации).Протестировано с разными версиями Tomcat (8.5 и 9).Та же проблема.

Рассматриваемая страница входа (см. Ниже):

HTML

<div id="form">
    <form id="loginEmp-Form">
        <input type="email" id="login" name="login" placeholder="email" />
        <input type="password" id="password" name="password" placeholder="password" /> 
        <input type="submit" id="loginButton" value="Connection" />
    </form>
    <div id="errorMsg"></div>
</div>

JAVASCRIPT

$('#loginEmp-Form').submit(function(event) {
    event.preventDefault();
    var loginReceived = loginForm.login.value;
    var passwordReceived = loginForm.password.value;
    //I deliberately deleted the logic concerning the password hashing to make it simple

    var Login = {
        login: loginReceived,
        password: passwordReceived
    };
    $.ajax({
        headers : {'Content-Type' : 'application/json;charset=utf-8'},
        type : 'POST',
        url : 'login',
        data : JSON.stringify(Login),
        success : function(result) {
            // DO SOMETHING
        },
        error : function(e) {
            // DO SOMETHING
        }
    });
}

JAVA

Контроллер

public class LoginController {

      private static final Logger LOGGER=LoggerFactory.getLogger(LoginController.class);

      @RequestMapping(value = "/login", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
      public ModelAndView processLoginEmployee(@RequestBody Login loginReceived, HttpSession session) {
            // Logic not detailed here because we're not even entering in the controller. Checked with the following traces.
            LOGGER.info("Received request POST"); // nothing display
            ModelAndView mav = null;
            return mav;
      }
}

Соответствующий компонент

public class Login {

     private String login;
     private String password;

     /*
     * Constructors
     */

     public Login(String login, String password) {
          super();
          this.login = login;
          this.password= password;
     }

     public Login() {
     }

     /*
     * Getters & setters
     */

     public String getLogin() {
          return login;
     }

     public void setLogin(String login) {
          this.login = login;
     }

     public String getPassword() {
          return password;
     }

     public void setPassword(String password) {
          this.password= password;

     }
}

AsЯ сказал, что когда я развертываю приложение на локальном Tomcat, все работает нормально (front-end и back-end).Я понимаю, что ошибка 415 относится к проблеме формата запроса.Но я не могу сказать, откуда это.Вот почему я прошу о помощи!Я часами пытался найти решение в Интернете, но безуспешно.

Другая информация:

  • GET Запросы работают нормально, даже при использовании удаленного Tomcat.
  • Я работаю в сети моей компании.Может ли какой-либо элемент безопасности блокировать почтовый запрос?Как брандмауэр?Я утверждаю, что нет, потому что некоторые коллеги разработали и развернули свои приложения на удаленном tomcat, и POST-запросы просто отлично работали.Я попросил их помощи, но они не нашли никакого решения.

То, что я уже пробовал -> Ajax call :

  • добавление / удаление заголовков с помощью 'content-type: application / json'
  • добавить / удалить «ContentType: application / json»

Java Controller :

  • добавить / удалить 'потребляет = MediaType.APPLICATION_JSON_VALUE '

Конфигурация Tomcat :

  • проверка того, подходит ли ограничение размера запросов
  • проверка, если tomcat имеет значениеоткрыт для удаленного соединения

Я пытался с почтальоном отправить точно такой же запрос.Результат: 415.

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

РЕШЕНИЕ

Проблема решена.2 вещи:

Во-первых, в pom.xl используйте только эту зависимость, а не более старую из org.codehaus.

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>

Maven собирается автоматически создавать все необходимые банки при сборке.Также еще одной ошибкой было использование обеих зависимостей одновременно (из codehaus и fastxml).Зависимости от fastxml - это те, которые будут использоваться сейчас.

Затем в контроллере были сделаны изменения:

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String processLoginEmployee(@RequestBody String json)
        throws JsonParseException, JsonMappingException, IOException {
    LOGGER.info("Received request POST");
    ObjectMapper mapper = new ObjectMapper();
    Login employee = mapper.readValue(json, Login.class);
    System.out.println(employee.getLogin());
    System.out.println(employee.getMdp());
    return "success";
}

Попытка получить объект напрямую с помощью @RequestParam не работает.Извлечение json-файла в виде строки и последующий синтаксический анализ с помощью ObjectMapper позволяет выполнить работу.

1 Ответ

0 голосов
/ 04 февраля 2019

Не устанавливать Content-Type, используя опцию headers.Установите параметр contentType.

$.ajax({
    contentType : 'application/json;charset=utf-8',
    type : 'POST',
    url : 'login',
    data : JSON.stringify(Login),
    success : function(result) {
        // DO SOMETHING
    },
    error : function(e) {
        // DO SOMETHING
    }
});

contentType по умолчанию 'application/x-www-form-urlencoded; charset=UTF-8', и он переопределяет все, что вы установили в параметре headers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...