春天bean的默認範圍是singleton。然而,當我已經定義下一個服務:春季的應用範圍
@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;
}
}
當登錄的用戶假設兩個用戶登錄,我得到地圖爲{1 =用戶1,9 =用戶2},但如果任何的用戶註銷然後內部onLogoutSuccess()方法我得到地圖值爲{}。現在如果有多個用戶登錄,那麼我得到地圖{1 = user1,9 = user2,3 = user3}。因此,Map僅在LogoutSuccess()方法內部變空,並且它在其他地方顯示填充值。
嗨,Petro,它仍然是我改爲@Autowired,但仍然LinkedHashmap是空的,當我註銷。我沒有在任何地方指定我的範圍 – user965884
我想我知道問題在哪裏。你可以請張貼代碼在你自動裝配usersLoggedInService負責添加登錄用戶的類 –
您好Petro,我已經更新了我的代碼。請檢查 – user965884