我的问题是,在使用Debian 9 VM上托管的远程tomcat时,通过AJAX发送的每个POST请求都返回415错误。相同的代码对于本地tomcat可以正常工作(相同版本,配置文件中没有差异)。 测试了不同版本的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;
}
}
对应的Bean
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;
}
}
正如我所说,当我在本地Tomcat上部署应用程序时,一切正常(前端和后端)。我了解415错误是指请求格式问题。但是我真的不能说它是从哪里来的。这就是我寻求帮助的原因!我花了数小时试图在Internet上搜索解决方案,但没有成功。
其他信息:
我已经尝试过的内容-> Ajax调用:
Java控制器:
Tomcat的配置:
我尝试与Postman发送完全相同的请求。结果:415。
如果有人找到解决方案或至少有建议,我将不胜感激。预先感谢您的宝贵时间。
解决方案
问题解决了。 2件事:
首先,在pom.xl中,仅使用此依赖关系,而不使用org.codehaus中的旧依赖关系。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
Maven将在构建时自动创建每个需要的jar。另外,另一个错误是同时使用两个依赖项(来自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对其进行解析即可完成工作。
答案 0 :(得分:1)
请勿使用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
选项中设置的所有内容。