Я проверил это в Tomcat 8.0.51 и 9.0.14 с одинаковыми результатами.Запуск в Ubuntu Linux 16.04.
Этот пример кода просто записывает все запросы на консоль (или catalina.out).Основная проблема заключается в том, что request.getRemoteUser()
всегда возвращает null
- даже когда пользователь аутентифицирован.
Я заметил, что клапаны AccessLogValve
и JDBCAccessLogValve
правильно возвращают имя пользователя / логин, когда пользователь имеетпроверку подлинности.Я показываю это ниже, показывая строки access_log для тех же строк кода, которые мой Valve записывает в стандартный консольный журнал.
Есть ли класс, который мне нужно расширить или реализовать, чтобы мой LoginValve
возвратил логин/ пользователь, когда пользователь аутентифицирован?Я также попробовал вызовы к request.getUserPrincipal()
, и он также всегда возвращает ноль.
Любая помощь в том, почему это заблокировано для ValveBase
, но работает для AccessLogs, очень ценится.
package org.apache.catalina.connector;
import java.io.IOException;
import java.time.LocalDateTime;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
public class LoginValve extends ValveBase {
public void invoke(Request request, Response response) throws IOException, ServletException {
String reqlogin=request.getRemoteUser();
String method=request.getMethod();
String requestURI=request.getRequestURI();
HttpSession session = request.getRequest().getSession();
String sid=session.getId();
String user_id = (String) session.getAttribute("UserID");
String sesslogin=(String) session.getAttribute("login"); // put in session by app code
LocalDateTime now=LocalDateTime.now();
System.out.println("LoginValve: "+now+" sid: "+sid+" UserID: "+user_id+" method: "+method+" requestURI: "+requestURI+" reqlogin: "+reqlogin+" sesslogin: "+sesslogin);
getNext().invoke(request, response);
}
}
Вывод, если LoginValve ниже.Обратите внимание, что поле, предоставляемое вызовом request.getRemoteUser()
, равно reqlogin .Поле sesslogin заполняется приложением в сеансе и не имеет ничего общего с вызовом getRemoteUser()
.
LoginValve: 2019-02-02T15:58:06.034 sid: 79D54B40DB8131E2A74375A67CE72ECD UserID: 3776559 method: GET requestURI: /app/auth/logoff.jsp reqlogin: null sesslogin: joe_user
LoginValve: 2019-02-02T15:58:06.050 sid: 41D1AD1DBBE5FA1D6EE4CB7A350D7DD6 UserID: null method: GET requestURI: /app/index.jsp reqlogin: null sesslogin: null
LoginValve: 2019-02-02T15:58:07.958 sid: 41D1AD1DBBE5FA1D6EE4CB7A350D7DD6 UserID: null method: GET requestURI: /app/user/index.jsp reqlogin: null sesslogin: null
LoginValve: 2019-02-02T15:58:10.006 sid: F75895CAE2521849902CF9894E39A039 UserID: null method: POST requestURI: /app/user/j_security_check reqlogin: null sesslogin: null
LoginValve: 2019-02-02T15:58:10.020 sid: F75895CAE2521849902CF9894E39A039 UserID: null method: GET requestURI: /app/user/index.jsp reqlogin: null sesslogin: null
LoginValve: 2019-02-02T15:58:13.743 sid: 0BBD2544A3C117E32FEE0A03840EAEAE UserID: 3776559 method: GET requestURI: /app/user/transactions.jsp reqlogin: null sesslogin: joe_user
LoginValve: 2019-02-02T15:58:18.127 sid: 0BBD2544A3C117E32FEE0A03840EAEAE UserID: 3776559 method: GET requestURI: /app/user/profile.jsp reqlogin: null sesslogin: joe_user
LoginValve: 2019-02-02T15:58:20.961 sid: 0BBD2544A3C117E32FEE0A03840EAEAE UserID: 3776559 method: GET requestURI: /app/user/feedback.jsp reqlogin: null sesslogin: joe_user
LoginValve: 2019-02-02T15:58:22.930 sid: 0BBD2544A3C117E32FEE0A03840EAEAE UserID: 3776559 method: GET requestURI: /app/user/ reqlogin: null sesslogin: joe_user
LoginValve: 2019-02-02T15:58:24.849 sid: 0BBD2544A3C117E32FEE0A03840EAEAE UserID: 3776559 method: GET requestURI: /app/auth/logoff.jsp reqlogin: null sesslogin: joe_user
LoginValve: 2019-02-02T15:58:24.872 sid: 879B16BB6831D4E07B486C7C0712AE5D UserID: null method: GET requestURI: /app/index.jsp reqlogin: null sesslogin: null
Вот выходные данные файла localhost_access_log (который ведет журналпользователь joe_user от его звонка до request.getRemoteUser()
:
127.0.0.1 - joe_user [02/Feb/2019:15:58:06 -0600] "GET /app/auth/logoff.jsp HTTP/1.1" 302 -
127.0.0.1 - - [02/Feb/2019:15:58:06 -0600] "GET /app/index.jsp HTTP/1.1" 200 9303
127.0.0.1 - - [02/Feb/2019:15:58:07 -0600] "GET /app/user/index.jsp HTTP/1.1" 200 6297
127.0.0.1 - - [02/Feb/2019:15:58:10 -0600] "POST /app/user/j_security_check HTTP/1.1" 303 -
127.0.0.1 - joe_user [02/Feb/2019:15:58:10 -0600] "GET /app/user/index.jsp HTTP/1.1" 200 29637
127.0.0.1 - joe_user [02/Feb/2019:15:58:14 -0600] "GET /app/user/transactions.jsp HTTP/1.1" 200 1742146
127.0.0.1 - joe_user [02/Feb/2019:15:58:18 -0600] "GET /app/user/profile.jsp HTTP/1.1" 200 9793
127.0.0.1 - joe_user [02/Feb/2019:15:58:21 -0600] "GET /app/user/feedback.jsp HTTP/1.1" 200 5476
127.0.0.1 - joe_user [02/Feb/2019:15:58:23 -0600] "GET /app/user/ HTTP/1.1" 200 29637
127.0.0.1 - joe_user [02/Feb/2019:15:58:24 -0600] "GET /app/auth/logoff.jsp HTTP/1.1" 302 -
127.0.0.1 - - [02/Feb/2019:15:58:24 -0600] "GET /app/index.jsp HTTP/1.1" 200 9303
Опять вопрос: как мне получить вызов на request.getRemoteUser()
, чтобы вернуть зарегистрированного пользователя, когда ониаутентифицированы.