我有2个控制器:
A)
@Override
@RequestMapping(value = "/portal/form.html", method = RequestMethod.GET)
@Transactional
public String form(final Message message, final Model model) {
return "portal/form";
}
b)中
@Override
@RequestMapping(value = "/portal/form.html", method = RequestMethod.POST)
@Transactional
@PreAuthorize("#message.id!=null ? hasPermission(#message, 'WRITE') : hasRole('ROLE_ADMIN')")
public String form(@Valid final Message message, final Model model) {
if (message.getId() == null) {
someService.save(message);
AclManager.create(message);
} else {
someService.update(message);
AclManager.update(message);
}
return "redirect:result.html";
}
在我在Controller“b”中加入安全注释之前,一切都很顺利。 现在,当我转到控制器“a”页面并填写表单时,单击一个导致控制器“b”的按钮,我得到“HTTP状态405 - 不支持请求方法'POST'”。 为什么会发生这种情况以及如何解决?
UPD :我帮助添加到登录控制器RequestMethod.POST
答案 0 :(得分:2)
如果没有Spring安全配置,很难调试,但是我猜你什么时候去/portal/form.html使用HTTP POST将你重定向到登录页面,而你的登录页面控制器处理程序只映射到HTTP GET 。尝试将登录页面处理程序映射到POST方法。
答案 1 :(得分:2)
在将应用程序使用Spring Security 3.2.0.RELEASE
从基于XML的配置迁移到基于 JavaConfig 的配置时,我也碰巧遇到了您描述的症状。
在我的特定情况下,使用 JavaConfig 时, HTTP Status 405 - Request method 'POST' not supported
的消息原因是Spring Security的默认激活CSRF保护 - 基于配置。
要删除此原因,可以:
要停用CSRF保护机制,请在WebSecurityConfigurer
执行以下操作:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable() //FIXME
.authorizeRequests() ....
}
// ...
}