伙计们! 我正在使用带有嵌入式tomcat和Redis的Spring boot 2进行分布式会话。 一切运行正常-我已经进行了分布式会话,并且能够进行蓝绿色部署。
问题是当我想跟踪Tomcat accesslog文件中对经过身份验证的用户的每个请求时。当我不使用redis进行会话时,一切正常。
Tomcat可以在从会话获取的日志文件中写入信息。
server.tomcat.accesslog.pattern=%h %l %{username}s %t "%r" %s %b %T %{User-Agent}i
其中%{username} s是会话参数,该值将保存在日志中。 我在春季会议的回调中添加了用户名-
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
String username = merchandiserRepository.findByUsername(authentication.getName()).getUsername();
request.getSession(true).setAttribute("username", username);
setUsernameInCookieOnLogin(response, username);
log.warn("Successfully logged in: {}", username);
response.sendRedirect("/page/1");
}
当我调试请求时,我注意到HttpSession sess = request.getSession(false);始终为null(并且存在隐藏的异常)
在提交响应后无法创建会话
在文件中-AbstactAccessLogValve-
protected static class SessionAttributeElement implements AbstractAccessLogValve.AccessLogElement {
private final String header;
public SessionAttributeElement(String header) {
this.header = header;
}
public void addElement(CharArrayWriter buf, Date date, Request request, Response response, long time) {
Object value = null;
if (null != request) {
HttpSession sess = request.getSession(false);
if (null != sess) {
value = sess.getAttribute(this.header);
}
} else {
value = "??";
}
if (value != null) {
if (value instanceof String) {
buf.append((String)value);
} else {
buf.append(value.toString());
}
} else {
buf.append('-');
}
}
}
这意味着我目前没有会话对象(这是不正确的)。 我想这与Servlet过滤器的顺序有关:
2019-07-15 14:49:34.079 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2019-07-15 14:49:34.079 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2019-07-15 14:49:34.084 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2019-07-15 14:49:34.084 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 4 of 12 in additional filter chain; firing Filter: 'LogoutFilter'
2019-07-15 14:49:34.084 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 5 of 12 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter'
2019-07-15 14:49:34.084 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 6 of 12 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
2019-07-15 14:49:34.084 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 7 of 12 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
2019-07-15 14:49:34.084 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 8 of 12 in additional filter chain; firing Filter: 'RememberMeAuthenticationFilter'
2019-07-15 14:49:34.085 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
2019-07-15 14:49:34.085 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 10 of 12 in additional filter chain; firing Filter: 'SessionManagementFilter'
2019-07-15 14:49:34.085 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 11 of 12 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
2019-07-15 14:49:34.085 DEBUG 17666 --- [nio-8080-exec-2] o.s.s.w.FilterChainProxy : /page/1 at position 12 of 12 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
有人可以帮助完成这个不容易的任务吗?
最诚挚的问候