相关配置
- Security配置
- @Resource
- private DataSource dataSource ;
- // 这里配置持久化登录token
- @Bean
- public PersistentTokenRepository persistentTokenRepository() {
- JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
- tokenRepository.setDataSource(dataSource) ;
- return tokenRepository;
- }
- SQL脚本
进入JdbcTokenRepositoryImpl中将其中的CREATE_TABLE_SQL语句复制出来执行下。
- HttpSecurity配置
- http.rememberMe()
- .tokenRepository(persistentTokenRepository())
- .userDetailsService(userDetailsService()) // 记住我功能有效期内,用来查询用户详细信息的UserDetailsService
- .tokenValiditySeconds(1800) ; // token有效期
登录页面
- <div class="c-row" style="height: auto;">
- <input type="checkbox" class="checkbox-control" id="remember-me" name="remember-me"/><label for="remember-me">记住我</label>
- </div>
注意这里的checkbox的name属性值必须是“remember-me”。
这样就可以实现记住我功能了。只要在token有效期内,每次打开页面都不需要重新登录了。
- 测试
登录后,关闭浏览器重写再打开页面不需要重新登录,同时查看数据表如下:
源码分析
我们从第一次登录开始
1.1 首先进入的
UsernamePasswordAuthenticationFilter过滤器,进入父类(AbstractAuthenticationProcessingFilter)的doFilter方法中。
直接进入登录成功的方法
1.2 执行successfulAuthentication方法
- successfulAuthentication(request, response, chain, authResult);
1.3 进入loginSuccess方法
进入
AbstractRememberMeServices类中的loginSuccess方法
1.4 执行子类
PersistentTokenBasedRememberMeServices中的onLoginSuccess方法。
这里的tokenRepository就是我们上面配置的
接着我们看再次打开浏览器后是如何实现免登录的。