SpringSecurity-HTTP Status 405 - Request method ‘POST‘ not supported

SpringSecurity的小麻烦-HTTP Status 405 - Request method ‘POST’ not supported

先看问题情况:我们想要的是在认证通过以后让页面跳转到authentication-success-forward-url的值所指向的路径,但实际情况下却是405错误HTTP Status 405 - Request method ‘POST’ not supported,由于现在是分享原因我肯定是知道真正问题所在,所以对于一些无关的代码这里不赘述,就按照常规正确配置即可,下面为了突出重点仅仅展示SpringSecurity中form-login中的配置。

		
        <security:form-login
                login-page="/loginPage"			
                default-target-url="/product"	
                authentication-failure-url="/loginPage" 
                authentication-success-forward-url="/product"	
        />

根据上面的配置,我们希望在我们输入正确的用户名及密码后可以让页面跳转到/product然后发现下面确实是报错了。
SpringSecurity-HTTP Status 405 - Request method ‘POST‘ not supported_第1张图片
但后台是可以接收到参数的,可以看到下面是可以根据username和password从数据库查到数据的,所以这里按照常规配置后拦截是可以正确拦截的,当登录后并查询出了数据并且交给了SpringSecurity做了校验,又由于没有重新跳转到loginPage所以可以推断出我们的认证是成功了的,但为什么抱405错误却不成功跳转呢? 但如果把表单中的method改为get则SpringSecurity将无法获得参数。
在这里插入图片描述
原因:
1、defaultSuccessUrl和successForwardUrl进行路径跳转的底层实现的方式不同

  • 前者是重定向后者是转发,这点从浏览器地址栏地址可以得到验证,看图可以发现我们的地址仍然是login。
  • 这又是因为registry.addViewController("/success").setViewName(“success”),这种路径映射方式不支持post请求,详细解析可以看 weixin_42074868他的这一篇文章

2、default-target-url与authentication-success-forward-url区别与联系

  • default-target-url:身份验证登陆成功后发送的请求(可以直接写页面,相当于直接跳转到页面;也可以写请求给前端控制器处理)
  • authentication-success-forward-url:在default-target-url发送的请求成功后,再发authentication-success-forward-url指定的请求。(可以直接写也页面,相当于直接请求页面,一般用于default-target-url的后续请求)

解决方法: 这里采用的解决方法就是讲authentication-success-forward-url改为default-target-url,并设置always-use-default-target=“true”
注意:

  • default-target-url一般用来指定登入成功后立马跳转到主界面;
  • authentication-success-forward-url用来指定登入成功且跳到主界面后,发送请求用户其他信息的请求。
  • 如果想要default-target-url生效,必须设置always-use-default-target=“true”

坑-1: 注意中也说明了,如果有其他的请求信息则default就不适用了,还有一种方法是应该重新定义一个Controller并且将Methods=RequestMethod.GET并将其映射到项目中。具体如何操作我还没研究明白,所以先挖个坑在这里,毕竟学到老活到老嘛。如果有懂得小伙伴也欢迎评论为这博客提供你的宝贵意见!

你可能感兴趣的:(烦人的报错,java,spring,http)