spring 中 bean 的默认作用域是单例。但是,当我定义下一个服务时:
@Service("usersLoggedInService")
public class UsersLoggedInServiceImpl implements UsersLoggedInService {
private Map<Long, String> OnlineUsers = new LinkedHashMap<Long, String>();
@Override
public Map<Long, String> getOnlineUsers() {
return OnlineUsers;
}
@Override
public void setOnlineUsers(Long id, String username) {
OnlineUsers.put(id, username);
}
@Override
public void removeLoggedOutUser(Long id){
if(!OnlineUsers.isEmpty() && OnlineUsers.size()>0)
OnlineUsers.remove(id);
}
}
并将其用于登录审核,因此每当新用户登录时,我都会通过以下方式将其添加到 OnlineUsers LinkedHashMap:
usersLoggedInService.setOnlineUsers(user.getId(), user.getUsername());
在我的服务班之一。这工作正常,我可以看到地图中添加的用户。
但是,在注销时,我想删除在 LinkedhashMap 中添加的用户,当我检查 usersLoggedInService.getOnlineUsers() 时,我可以看到它是空的。我不明白为什么。
注销处理程序定义:
<logout invalidate-session="true"
logout-url="/logout.htm"
success-handler-ref="myLogoutHandler"/>
及其实现:
@Component
public class MyLogoutHandler extends SimpleUrlLogoutSuccessHandler {
@Resource(name = "usersLoggedInService")
UsersLoggedInService usersLoggedInService;
@Override
public void onLogoutSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
if (authentication != null) {
Object principal = authentication.getPrincipal();
if(principal instanceof User){
User user = (User) principal;
usersLoggedInService.removeLoggedOutUser(user.getId());
}
}
setDefaultTargetUrl("/login");
super.onLogoutSuccess(request, response, authentication);
}
}
请让我知道问题出在哪里。我不希望这张地图是空的。
- - -更新 - - -
当新用户登录时,我可以看到所有已添加到 LinkedHashmap 中的用户。此方法位于用户服务类之一中:
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
UsersLoggedInService usersLoggedInService;
@Override
public User getUserDetail() {
Authentication auth = SecurityContextHolder.getContext()
.getAuthentication();
Object principal = auth.getPrincipal();
if(principal instanceof User){
User user = (User) principal;
usersLoggedInService.setOnlineUsers(user.getId(), user.getUsername());
return user;
}
return null;
}
}
当用户登录时,假设有两个用户登录,我将 Map 设为 {1=user1, 9=user2},但如果有任何用户注销,则在 onLogoutSuccess() 方法中,我将 Map 值设为 {}。现在,如果再有一个用户登录,那么我会得到地图 {1=user1, 9=user2, 3=user3}。因此,Map 仅在 onLogoutSuccess() 方法内部变空,并且在其他任何地方显示填充值。