Моя проблема в том, что каждый 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 позволяет выполнить работу.