Spring Security-在AuthenticationSuccessHandler中获取SESSION Cookie值

时间:2019-01-31 13:25:12

标签: spring spring-boot spring-security spring-session

我知道Spring Security在成功认证后会创建一个名为SESSION的cookie。是否可以在AuthenticationSuccessHandler中保留该cookie值。

我有一个以下实现,我需要该SESSION cookie值。我看做是HttpServletResponse的响应标头,但它们具有XSRF-TOKEN set-cookie标头,

@Component
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

  @Override
  public void onAuthenticationSuccess(
      HttpServletRequest request, HttpServletResponse response, Authentication authentication)
      throws IOException {

   // GET SESSION, COOKIE VALUE HERE
  }
}

可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

SESSION cookie是由Spring Session的DefaultCookieSerializer创建的,每次创建新Session时都会调用该cookie,不一定要在成功认证后调用。

Spring Session的SessionRepositoryFilter包装HttpServletRequest的方式是,无论何时在应用程序中的任何时候从请求中获取HttpSession时,您实际上都在获取Spring Session对象。但是,此Cookie会在调用处理程序后写入响应中,如SessionRepositoryFilter所示:

try {
        filterChain.doFilter(wrappedRequest, wrappedResponse);
    }
    finally {
        wrappedRequest.commitSession(); //the SESSION cookie is created if necessary
    }

因此,如果刚刚为此请求创建了会话...

  1. 该cookie在HttpServletRequest中将不可用,因为该cookie尚未发送(因此浏览器无法发送它)
  2. 该cookie不会作为“ Set-Cookie”标头作为HttpServletResponse头,因为它将在您的应用程序处理请求之后写入。

但是,您可以获得cookie值:

String cookieValue = request.getSession().getId();

注意:上面的代码将强制Spring Session创建一个由会话支持的Redis / Jdbc / etc,稍后将使用它来生成SESSION cookie。

答案 1 :(得分:0)

我从请求中使用https://rextester.com/DVDC79947 方法获得了它。我的示例将Webflux实现与Kotlin结合使用,但显然在getSession().getId()实现中的工作原理类似,请参见https://javaee.github.io/javaee-spec/javadocs/javax/servlet/http/HttpServletRequest.html#getSession--

HttpServletRequest