【问题标题】:How do i get form inputs to controller using @RequestParam Annotation如何使用 @RequestParam 注解将表单输入输入到控制器
【发布时间】:2019-07-27 20:22:41
【问题描述】:

我正在尝试从 Spring Boot 应用程序的表单中获取用户输入。我需要做什么?

我实现了一个登录控制器,它使用@RequestParam 注释来请求数据进行验证,但得到的结果是参数不存在。

// LoginController.java

@PostMapping(path = "/login")
public String userLogin(@RequestParam("email") String email, 
    @RequestParam("password") String password) {

    // validate username and password
    User user = userRepository.findUserByEmail(email);
    System.out.println(user.getEmail()+" "+user.getPassword());
    if(!(user.getEmail()==email) || !(user.getPassword()==password)){
        logger.info("Invalid user details or not register");
        return "login failed";
    }

    try{
        loginService.login(email, password);
        logger.info("User successfully login");
        return "redirect:dashboard/profile";
    }catch (Exception ex){
        logger.info("",ex);
    }
    return "Successfully logged in ..";
}

登录.html

<form th:action="@{/login}" method="post" class="form-horizontal" role="form">
    <form:hidden path/>
    <div class="form-group">
        <div class="mb-3">
            <input type="email" class="form-control" name="email" id="email" placeholder="example@gmail.com" required="required">
        </div>
    </div>

    <div class="form-group">
        <div class="mb-3">
            <input type="password" class="form-control" name="password" id="password" placeholder="" required="required">
        </div>
    </div>

    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <label>
                <input type="checkbox"> Remember me
            </label>
            <button type="submit" class="btn btn-success">Login</button>
        </div>
    </div>
</form>

我希望用户的电子邮件和密码才能登录但得到

2019-07-27 20:30:54.393 警告 2900 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver :已解决 [org.springframework.web.bind.MissingServletRequestParameterException: 必需的字符串参数“电子邮件”不存在]

【问题讨论】:

  • 包含调用 API 的代码
  • 为什么要提交表单值作为参数?您可以简单地在requestBody 中以表单形式提交,并在 POJO 中绑定数据以供以后使用。
  • 启用调试日志并检查被调用和解析的 URL。另外,您是真的提交表单还是还使用 JavaScript 框架来处理实际的表单提交?

标签: java spring-boot


【解决方案1】:

您必须从前端发送参数名称:

   const payload: FormData = new FormData();
   payload.append("email", emai);
   payload.append("password", password);

【讨论】:

  • 提交表单不需要这个。
【解决方案2】:

由于 API 设计错误和 URL 中的 RequestParam 不匹配导致的问题。

将您的 API 更改为:

@PostMapping(path = "/login") public String userLogin(@RequestBody Map<String, Object> user) {
          String username=user.get("user").toString();
          String password=user.get("password").toString();
}

你的请求正文 JSON 应该是这样的。

{
"user":"USER",
"password":"pass5&234rf"
}

这是来自客户端的 POST 请求的 JSON 有效负载(正文)。

【讨论】:

  • 发送一个简单的表单不需要 JSON 有效负载,并且将它们作为参数发送没有任何问题。并非所有东西都需要 JSON。
  • 他发送的用户名和密码并不安全。这就是为什么我建议他使用有效负载发布请求。
  • 这并不安全,您仍然可以阅读正文。除此之外,他问的不是关于表单提交的问题,而不是关于将其更改为 javascript 并进行 JSON 发布的问题。
  • 谢谢你们,这真的很有帮助。只是已经开始做其他事情了。会调查的
  • 谢谢你们,这真的很有帮助。只是已经开始做其他事情了。会调查的
猜你喜欢
  • 2017-12-02
  • 2017-12-21
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
相关资源
最近更新 更多