当前位置: 首页 > 科技观察

登录成功后的SpringSecurity自定义逻辑

时间:2023-03-21 18:51:38 科技观察

环境:SpringBoot2.2.11.RELEASE+SpringSecurity5.2.7背景:我们有一个基于NW.js的项目,通过SpringSecurity实现用户登录。我们在nw.js环境做了检查,如果用户在2小时内没有任何操作,系统会自动调整到登录页面;这是一个问题,我们有很多7*24小时不关电脑的用户。2小时后用户下班时,系统自动跳转到登录页面。第二天用户上班后,登录系统无法调整到之前的操作页面。用户每天都在抱怨。实际上,当我们访问一个需要用户认证的页面时,我们会在没有登录的情况下跳转到登录页面,如果30分钟内不操作,我们将无法跳回。基于以上问题,追溯源码发现,SpringSecurity通过session保存了之前请求的所有相关信息。源码如下:认证通过后,执行如下逻辑。AbstractAuthenticationProcessingFilter.java这里的successHandler默认使用下面的handler。SAVEDREQUESTAWAREATHENTICATIONSUCCESSHANDLER.JAVAREQUESTCACHE对象对象实例httpsessionRequestRequestCachehhtpsessionRequestcache.java部分defleaultsavedRequestSavedRequestSavedRequestSavedRequestRequestRequestRequestRequestRequestRequest=NewDefeaultSavedSavedSavedRequestSavedRequestseession(request));logger.debug("DefaultSavedRequestaddedtoSession:"+savedRequest);}这里是将当前请求对象保存到session中,保存后跳转到登录授权页面。如果未配置会话,则默认为30分钟。当时为了简单快速的解决问题,我把session的有效期调整为一天。沉默了一段时间后,我觉得已经没事了。没想到后来有几个用户抱怨o(╥﹏╥)o,我认识他们说有时候几天才用一次系统(所以还是不关电脑)。..没办法,只能继续改代码。通过上面贴出的源码,我也知道了之前的request对象是从session中获取,然后进行重定向的。在配置HttpSecurity的时候,配置一个自定义的sucessHandler。nw.js在做跳转的时候,我记录下用户上次操作页面的地址,作为参数传过去。这样就不怕session过期了。