限制创建没有主体的会话

Restrict creation of Sessions which do not have principal

我正在使用 Spring 会话和 JDBC,它工作正常。但是有许多会话是在没有委托人的情况下创建的。 即使是一个简单的 curl 请求也会在数据库中创建一个新的会话条目。

我们可以限制没有主体的会话的创建吗?

这里的principal指的是登录用户

示例数据库数据:

SESSION_ID| CREATION_TIME| LAST_ACCESS_TIME | MAX_INACTIVE_INTERVAL | PRINCIPAL_NAME

| 0112a88c | 1567062697443 | 1567062697443 | 43200 | abc@gmail.com

| 0123f31e | 1567063051563 | 1567063051563 | 43200 | NULL

更新:这些会话是为状态 api 呼叫创建的。

设置 SessionCreationPolicy 无效。我通过引入过滤器解决了这个问题。

@Component
public class ExcludeSessionRepositoryFilter extends OncePerRequestFilter {

  @Override
  protected void doFilterInternal(HttpServletRequest httpRequest, HttpServletResponse httpResponse,
                                  FilterChain filterChain) throws ServletException, IOException {
    httpRequest.setAttribute("org.springframework.session.web.http.SessionRepositoryFilter.FILTERED", Boolean.TRUE);
    filterChain.doFilter(httpRequest, httpResponse);
  }
}

我将使用以下代码排除自定义 api 的会话创建。这不会在 SPRING_SESSION table.

中创建虚拟会话

@Bean
  public FilterRegistrationBean sessionExclusionFilterRegBean(ExcludeSessionRepositoryFilter excludeSessionRepositoryFilter) {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(excludeSessionRepositoryFilter);

    registrationBean.setOrder(Integer.MIN_VALUE);
    registrationBean.addUrlPatterns("/hello", "/status");

    return registrationBean;
  }