限制 Spring Boot 应用程序中的会话总数
Limit the total amount of sessions in a Sprint Boot application
在我们的 Spring 引导网络服务器中,我知道如何限制每个用户的会话数 (httpSecurity.sessionManagement().maximumSessions()
),但我想限制会话总数,以避免服务器负载.
如何做到这一点?
如果 'total number of users' 在您的系统中是 'load' 的有意义的代理(请参阅@JBNizet 的评论),例如如果大多数请求在资源占用方面都是相同的,那么您可以定义自己的 SessionAuthenticationStrategy
实现。这是一个简单的例子:
private class AllUsersConcurrentSessionControlAuthenticationStrategy extends ConcurrentSessionControlAuthenticationStrategy {
// probably inject this from application configuration
private final int maxUsers;
private final SessionRegistry sessionRegistry;
public AllUsersConcurrentSessionControlAuthenticationStrategy(int maxUsers, SessionRegistry sessionRegistry) {
super(sessionRegistry);
this.maxUsers = maxUsers;
this.sessionRegistry = sessionRegistry;
}
@Override
public void onAuthentication(Authentication authentication, HttpServletRequest request,
HttpServletResponse response) {
if (sessionRegistry.getAllPrincipals().size() > maxUsers) {
throw new SessionAuthenticationException("...");
}
super.onAuthentication(authentication, request, response);
}
}
你这样注册:
http.sessionManagement().sessionAuthenticationStrategy(new AllUsersConcurrentSessionControlAuthenticationStrategy(maxUsers, sessionRegistry));
但是,如果 'total number of users' 不是 'load' 的有意义的代理,那么您也许应该考虑以非阻塞方式实现您的服务端点将其请求传递给线程池,并且请求到线程池的分配策略可以考虑 'heavy' 请求的方式。轻量级请求可以由 large 线程池处理,heavyweitgh 请求可以由 smaller 线程池处理。
在我们的 Spring 引导网络服务器中,我知道如何限制每个用户的会话数 (httpSecurity.sessionManagement().maximumSessions()
),但我想限制会话总数,以避免服务器负载.
如何做到这一点?
如果 'total number of users' 在您的系统中是 'load' 的有意义的代理(请参阅@JBNizet 的评论),例如如果大多数请求在资源占用方面都是相同的,那么您可以定义自己的 SessionAuthenticationStrategy
实现。这是一个简单的例子:
private class AllUsersConcurrentSessionControlAuthenticationStrategy extends ConcurrentSessionControlAuthenticationStrategy {
// probably inject this from application configuration
private final int maxUsers;
private final SessionRegistry sessionRegistry;
public AllUsersConcurrentSessionControlAuthenticationStrategy(int maxUsers, SessionRegistry sessionRegistry) {
super(sessionRegistry);
this.maxUsers = maxUsers;
this.sessionRegistry = sessionRegistry;
}
@Override
public void onAuthentication(Authentication authentication, HttpServletRequest request,
HttpServletResponse response) {
if (sessionRegistry.getAllPrincipals().size() > maxUsers) {
throw new SessionAuthenticationException("...");
}
super.onAuthentication(authentication, request, response);
}
}
你这样注册:
http.sessionManagement().sessionAuthenticationStrategy(new AllUsersConcurrentSessionControlAuthenticationStrategy(maxUsers, sessionRegistry));
但是,如果 'total number of users' 不是 'load' 的有意义的代理,那么您也许应该考虑以非阻塞方式实现您的服务端点将其请求传递给线程池,并且请求到线程池的分配策略可以考虑 'heavy' 请求的方式。轻量级请求可以由 large 线程池处理,heavyweitgh 请求可以由 smaller 线程池处理。