2013-07-04 51 views
2

我有2个控制器:放安全注解后, “请求方法 'POST' 不支持”

一)

@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"; 
} 

在我把安全的注解中控制器“b”一切都很好。 现在,当我转到控制器“a”的页面并填写表单时,单击一个导致控制器“b”的按钮,并且我得到“不支持”HTTP状态405 - 请求方法'POST'。 为什么会发生这种情况,以及如何解决它?

UPD:我帮添加到登录控制器RequestMethod.POST

回答

2

很难没有你的春季安全配置进行调试,但是当你去/portal/form.html春天重定向你我猜使用HTTP POST登录页面,而登录页面控制器处理程序仅映射到HTTP GET。尝试将登录页面处理程序映射到POST方法。

2

当我的应用程序将Spring Security 3.2.0.RELEASE从基于XML的配置迁移到基于的JavaConfig的配置时,我碰巧遇到了您描述的症状。

在我的特殊情况下,HTTP Status 405 - Request method 'POST' not supported消息的原因是使用JavaConfig基础的配置时,Spring Security的CSRF保护的默认激活。

要删除此原因之一,可以:

  • 或者更新应用程序遵循Spring Security的CSRF保护机制
  • 或关闭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() .... 
    } 

    // ... 
} 
+0

太谢谢你了。在过去的一天里,我一直在抨击同一个问题。 – sandeepsharat

相关问题