Spring项目报错:Required parameter 'username' is not present 求助
提交表单时,表单设置action="userlogin"、method="post",但无法跳转到预期的index页面。通过Postman测试时,出现报错:
trace信息显示
org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'username' for method parameter type String is not present,message为"Required parameter 'username' is not present"
相关代码如下:
package com.home_project.oop_project.controllers; import java.sql.*; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @Controller public class UserController { int adminlogcheck = 0; String usernameforclass = ""; //Some code @GetMapping("userlogin") public String userlog(Model model) { return "userLogin"; } @RequestMapping(value = "userlogin", method = RequestMethod.POST) public String userlogin( @RequestParam("username") String username, @RequestParam("password") String pass,Model model) { try { System.out.println(username); Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/springproject","root",""); Statement stmt = con.createStatement(); ResultSet rst = stmt.executeQuery("select * from users where username = '"+username+"' and password = '"+ pass+"' ;"); if(rst.next()) { usernameforclass = rst.getString(2); return "redirect:/index"; } else { model.addAttribute("message", "Invalid Username or Password"); return "userLogin"; } } catch(Exception e) { System.out.println("Exception:"+e); } return "userLogin"; } }
1. 检查前端表单字段的name属性
报错核心是Spring无法匹配到username参数,需确认前端表单中用户名输入框的name属性严格为username,密码输入框为password,示例:
<form action="userlogin" method="post"> <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <button type="submit">登录</button> </form>
若name属性拼写错误(如userName、user),Spring无法绑定到@RequestParam注解的参数。
2. 修复SQL注入风险与语法问题
当前代码直接拼接SQL语句,存在严重注入风险,同时原代码中DriverManager.getConnection的密码参数有语法错误(原代码为"""",需改为"")。建议改用PreparedStatement:
// 替换原Statement相关代码 String sql = "select * from users where username = ? and password = ?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, username); pstmt.setString(2, pass); ResultSet rst = pstmt.executeQuery();
3. 验证Postman请求参数格式
用Postman测试时,需选择form-data或x-www-form-urlencoded格式传递参数,而非raw的JSON格式(当前代码用@RequestParam接收表单参数,不支持JSON格式直接绑定)。
4. 优化资源关闭与异常处理
当前代码未关闭数据库连接、Statement、ResultSet,会导致资源泄漏,建议在finally块中统一关闭:
finally { try { if (rst != null) rst.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } }
同时,异常处理可添加前端提示信息:
catch(Exception e) { e.printStackTrace(); model.addAttribute("message", "服务器异常,请稍后重试"); }
内容的提问来源于stack exchange,提问作者Lê Trung Hiếu

