spring security使用自定义登录界面后,不能返回到之前的请求界面的问题
昨天因为集成spring security oauth2,所以对之前spring security的配置进行了一些修改,然后就导致登录后不能正确跳转回被拦截的页面,而是返回到localhost根目录。
开始以为是被oauth2拦截了导致出了问题,但是security的拦截器是优先起作用的,所以这不可能。
最后实在没法只有打断点调试找毛病(下图为spring security登录后重定向至拦截前访问的url的实现原理流程)
图片是在这里看到的https://blog.csdn.net/zy_cookie/article/details/49535413
从图上可以看出保存 被拦截的request是在 这个类里进行的
HttpSessionRequestCache
在IDEA里搜索这个类,在saveRequest方法设置一个断点,然后进行调试
调试发现当浏览器输入权限限制的url时(如/admin/console),系统会调用saveRequest方法对当前request对象进行缓存(如下图所示)
既然保存的是/admin/console,但是为啥取出来的是/呢,继续执行就发现问题了,系统又调用了一次saveRequest方法,而这次保存的request对象是“/”路径的
也就是说之前保存的就是被这个给覆盖了,通过源码可以发现,saveRequest方法中是把request对象缓存到session,而且key值为静态值(由此可见如果我们想要自定义一些方法时可以通过该key值取出保存的request对象,不过系统也提供了getRequst方法)
根据流程图可知只有被拦截的请求才会被捕获保存起来,于是我去检查我webSercurityConfig,发现除了静态资源其他的资源全都需要验证,也因此“/”根目录被拦截了,把“/”添加到排除列表后问题解决
通过后续的调试发现“/”是因为我自定义的登录页面发出的该请求
值得注意的是spring security完成用户登录后跳转会原页面的处理是在
SavedRequestAwareAuthenticationSuccessHandler类里面进行的,如果想要自定义登录成功后的操作可以继承该类,重写该方法
不过我当时写的时候因为生成的代码里自动生成调用父类的该方法导致获取不到saveRequest(就是下面这行)
原因是在
SavedRequestAwareAuthenticationSuccessHandler类处理时,获取到saveRequst后会对session中缓存的进行删除