Spring Security POST /error返回405 METHOD_NOT_ALLOWED错误求助
问题排查与修复方案
核心错误原因
- 1 注册提交接口未指定请求方法:
UserController中处理注册逻辑的addUser方法使用@RequestMapping时未指定method = RequestMethod.POST,而同路径/registration已存在明确的@GetMapping方法,Spring MVC会判定该路径仅支持GET请求,POST表单提交时直接触发405方法不允许错误。 - 2 安全配置放行规则不匹配:
WebSecurityConfig中配置的放行规则*/registration/*仅能匹配路径中间包含/registration/的请求(如/user/registration/edit),直接提交到/registration的POST请求不在放行范围内,属于潜在的拦截隐患。 - 3 接口返回配置不符合实际需求:
addUser方法指定了produces返回JSON/XML格式,但方法返回值为void,且表单提交场景需要页面跳转,该配置会增加请求匹配失败的概率。
具体修复步骤
步骤1:修正控制器注册接口映射
将addUser方法的映射注解替换为@PostMapping,移除不必要的配置,增加注册成功后的重定向逻辑:
// 替换原来的@RequestMapping注解即可,其余逻辑不变 @PostMapping("/registration") public String addUser(@RequestParam Map<String, String> body) { User user = new User(); user.setUsername(body.get("username")); user.setPassword(passwordEncoder.encode(body.get("password"))); user.setAccountNonLocked(true); userDetailsManager.createUser(user); // 注册成功后跳转到登录页 return "redirect:/login"; }
步骤2:修正安全配置的放行规则
修改WebSecurityConfig中的antMatcher规则,确保/registration路径的所有请求都放行:
// 替换原有antMatchers配置 .antMatchers("/", "/index","/registration").permitAll()
可选优化:实体类接收表单参数
可以直接用@ModelAttribute接收表单提交的User对象,简化代码:
@PostMapping("/registration") public String addUser(@ModelAttribute User user) { user.setPassword(passwordEncoder.encode(user.getPassword())); user.setAccountNonLocked(true); userDetailsManager.createUser(user); return "redirect:/login"; }
内容的提问来源于stack exchange,提问作者jdargatz
相关产品推荐
相关产品推荐

