对远程tomcat的AJAX发布请求返回415

时间:2019-02-04 16:09:38

标签: javascript java ajax spring-mvc tomcat

我的问题是,在使用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上搜索解决方案,但没有成功。

其他信息:

  • 即使在使用远程Tomcat时,GET请求也可以正常工作。
  • 我正在公司的Internet网络上工作。任何安全元素都可以阻止发布请求吗?像防火墙一样?我声称不可以,因为一些同事在远程tomcat上开发并部署了他们的应用程序,而POST请求则运行得很好。我寻求他们的帮助,但他们没有找到任何解决方案。

我已经尝试过的内容-> Ajax调用

  • 添加/删除具有“内容类型:应用程序/ json”的标头
  • 添加/删除“ ContentType:应用程序/ json”

Java控制器

  • 添加/删除'consumes = MediaType.APPLICATION_JSON_VALUE'

Tomcat的配置

  • 检查请求的大小限制是否合适
  • 检查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对其进行解析即可完成工作。

1 个答案:

答案 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选项中设置的所有内容。