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