Refer from http://blog.youkuaiyun.com/yangxuan0261/article/details/10014111
在spring security中有个 SessionRegistryImpl 的类,实现了 SessionRegistry 接口,这个实现类里有session的具体信息。
我实现踢出功能用户功能就是比对已注册的session的用户的用户名,比对成功则调用isExpired() 让其session过期,当用户再次访问时就会跳转到session timeout的页面。
下面直接贴代码
- private SessionRegistry sessionRegistry;
-
- @Resource(name = "sessionRegistry")<span style="white-space:pre">
- public void setSessionRegistry(SessionRegistry sessionRegistry) {
- this.sessionRegistry = sessionRegistry;
- }
-
- @RequestMapping(value = "/admin/kickoutUser.do")
- @ResponseBody
- public String kickoutUser(@RequestParam(value = "username") String username) {
- System.out.println("kick out : " + username);
- List<Object> objects = this.sessionRegistry.getAllPrincipals();
- for (Object o : objects) {
- Users user = (Users) o;
- if (user.getUsername().equals(username)) {
- List<SessionInformation> sis = this.sessionRegistry
- .getAllSessions(o, false);
- if (sis != null) {
- for (SessionInformation si : sis) {
- si.expireNow();
- System.out
- .println(si.isExpired() ? "yes, session be expired"
- : "no yet,session still active");
-
- System.out.println("---" + username
- + "---have be kick out!");
- }
- }
- return "success";
- }
- }
- System.out.println("no one call ---" + username + "---login");
- return "error";
- }</span>
当踢出用户后,用户要有动作跳转到session timeout页面后,你在刷新一次当前所有在线用户才会看不到你所踢出的用户。