环境:Spring Boot 2.2.11.RELEASE + Spring Security5.2.7
说下背景:我们有个项目是基于NW.js,用户登录是通过Spring Security来实现的。我们在nw.js环境下做了一个校验,如果用户2小时内没有任何的操作那么系统将自动调整到登录页面;这样就出现了问题,我们有很多的用户是7*24小时不关电脑的。当用户下班2小时后系统就自动跳转到了登录页面,第二天用户上班了后登录系统调不到之前的操作页面。用户天天投诉。其实当我们访问需要用户认证的页面时没登录情况下都会跳到登录页如果30分钟内什么都不操作同样也是跳不回去的。
基于上面的问题后来跟踪了下源码发现Spring Security是通过session来保存之前的请求的所有相关信息,源码如下:
认证通过后执行下面的逻辑
AbstractAuthenticationProcessingFilter.java
这里的successHandler默认是使用的如下handler。
SavedRequestAwareAuthenticationSuccessHandler.java
requestCache对象的实例是HttpSessionRequestCache
HttpSessionRequestCache.java部分源码
- DefaultSavedRequest savedRequest = new DefaultSavedRequest(request,portResolver);
- if (createSessionAllowed || request.getSession(false) != null) {
- request.getSession().setAttribute(this.sessionAttrName, savedRequest);
- logger.debug("DefaultSavedRequest added to Session: " + savedRequest);
- }
这里就是把当前的request对象进行了保存然后放到了session中,保存后再跳转到登录授权页面。session不配置的情况下默认就是30分钟。
当时为了简单快速解决问题,我之间吧session的有效性调整了1天时间,安静了一段时间后,以为没事了。万万没想到后来有几个用户有投诉了o(╥﹏╥)o,大概了解了下他们说有时候几天才用一次系统(就这样他们还是不关电脑)。。。没办法只能继续改代码了。
通过上面贴的源码也知道了就是从session获取到之前的request对象然后进行了重定向。
在配置HttpSecurity时配置自定义sucessHandler,如下
nw.js在做跳转的时候,我把用户之前的操作页面地址记录下来作为一个参数传递。这样就不怕session过期了。