gpt4 book ai didi

java - Spring 应用范围

转载 作者:行者123 更新时间:2023-11-29 08:01:42 26 4
gpt4 key购买 nike

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());

在我的一个服务类(class)中。这工作正常,我可以在 map 中看到添加的用户。

但是,当我注销时,我想删除在 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);
}

}

请告诉我问题出在哪里。我不希望这张 map 是空的。

-----已更新------

当新用户登录时,我可以看到所有已添加到 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 值为 {}。现在,如果再有一个用户登录,我会得到 map {1=user1, 9=user2, 3=user3}。因此,Map 仅在 onLogoutSuccess() 方法内部变空,它在其他任何地方都显示填充值。

最佳答案

根据您的描述,似乎为处理程序创建了新的服务实例。

您的配置的默认范围可能不是单例(应该很容易检查)。

此外,您能否尝试使用 @Autowired 注释? @Autowire@Resource 之间存在细微差别,文档中看起来它不应该导致此类问题,但无论如何都值得尝试:

@Component
public class MyLogoutHandler extends SimpleUrlLogoutSuccessHandler {

@Autowired
private UsersLoggedInsService usersLoggedInService;

// ...
}

-----更新 #1 ------

是的,试试 @Autowired@Qualifier(当我尝试那个没有限定符的例子时,spring 创建了两个实例):

  @Autowired
@Qualifier("usersLoggedInService")
UsersLoggedInService usersLoggedInService;

----更新 #2 ------

好吧,我只是复制了示例项目中的所有代码,它可以在我的机器上运行

您是否可以在类似 GitHub 的服务上共享您的代码库? ?

关于java - Spring 应用范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13963553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com