我知道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
}
}
可以帮忙吗?
答案 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
}
因此,如果刚刚为此请求创建了会话...
但是,您可以获得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