diff --git a/web-modules/javax-servlets-2/pom.xml b/web-modules/javax-servlets-2/pom.xml
index 9ba12352fd..a6bfc6b473 100644
--- a/web-modules/javax-servlets-2/pom.xml
+++ b/web-modules/javax-servlets-2/pom.xml
@@ -68,6 +68,17 @@
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+ com.github.ua-parser
+ uap-java
+ ${uap.version}
+
@@ -101,6 +112,8 @@
2.22.2
10.0.4
1.10.0
+ 5.6.0
+ 1.5.4
\ No newline at end of file
diff --git a/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java
new file mode 100644
index 0000000000..3533bf500b
--- /dev/null
+++ b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java
@@ -0,0 +1,26 @@
+package com.baeldung.servlets;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.servlets.clientinfo.AccountLogic;
+
+@WebServlet(name = "AccountServlet", urlPatterns = "/account")
+public class AccountServlet extends HttpServlet {
+ public static final Logger log = LoggerFactory.getLogger(AccountServlet.class);
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ AccountLogic accountLogic = new AccountLogic();
+ Map clientInfo = accountLogic.getClientInfo(request);
+ log.info("Request client info: {}, " + clientInfo);
+
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+}
diff --git a/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java
new file mode 100644
index 0000000000..00f3a5ca39
--- /dev/null
+++ b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java
@@ -0,0 +1,32 @@
+package com.baeldung.servlets.clientinfo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import ua_parser.Client;
+import ua_parser.Parser;
+
+public class AccountLogic {
+ public Map getClientInfo(HttpServletRequest request) {
+ String remoteAddr = request.getRemoteAddr();
+ String remoteHost = request.getRemoteHost();
+ String remoteUser = request.getRemoteUser();
+ String contentType = request.getHeader("content-type");
+ String userAgent = request.getHeader("user-agent");
+
+ Parser uaParser = new Parser();
+ Client client = uaParser.parse(userAgent);
+
+ Map clientInfo = new HashMap<>();
+ clientInfo.put("os_family", client.os.family);
+ clientInfo.put("device_family", client.device.family);
+ clientInfo.put("userAgent_family", client.userAgent.family);
+ clientInfo.put("remote_address", remoteAddr);
+ clientInfo.put("remote_host", remoteHost);
+ clientInfo.put("remote_user", remoteUser);
+ clientInfo.put("content_type", contentType);
+ return clientInfo;
+ }
+}
diff --git a/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java b/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java
new file mode 100644
index 0000000000..4ff5256f37
--- /dev/null
+++ b/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.servlets.clientinfo;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.mockito.Mockito.when;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+public class ClientInformationUnitTest {
+
+ @Test
+ void givenMockHttpServletRequestWithHeaders_whenGetClientInfo_thenReturnsUserAGentInfo() {
+ HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+
+ when(request.getHeader("user-agent")).thenReturn("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36, acceptLanguage:en-US,en;q=0.9");
+ when(request.getHeader("content-type")).thenReturn("application/json");
+ when(request.getRemoteAddr()).thenReturn("198.167.0.1");
+ when(request.getRemoteHost()).thenReturn("baeldung.com");
+ when(request.getRemoteUser()).thenReturn("baeldung");
+
+ AccountLogic accountLogic = new AccountLogic();
+ Map clientInfo = accountLogic.getClientInfo(request);
+ assertThat(clientInfo.get("os_family")).isEqualTo("Mac OS X");
+ assertThat(clientInfo.get("device_family")).isEqualTo("Mac");
+ assertThat(clientInfo.get("userAgent_family")).isEqualTo("Chrome");
+ assertThat(clientInfo.get("content_type")).isEqualTo("application/json");
+ assertThat(clientInfo.get("remote_user")).isEqualTo("baeldung");
+ assertThat(clientInfo.get("remote_address")).isEqualTo("198.167.0.1");
+ assertThat(clientInfo.get("remote_host")).isEqualTo("baeldung.com");
+ }
+}
\ No newline at end of file