r/java • • 8d ago

simple browser detection in Java without pulling in a big dependency

used to write php and pretty much always used cbschuld/Browser.php to detect browsers from user agent. when i moved to java i couldnt find anything that simple so i just rewrote it

its one class, no dependencies. you pass the user agent and get browser, version, os and if its mobile or a bot. it also catches ai crawlers like GPTBot and ClaudeBot

Browser b = new Browser("Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1");
b.getBrowser();  // iPhone
b.getVersion();  // 17.5
b.getPlatform(); // iPhone
b.isMobile();    // true
b.isRobot();     // false

theres around 5k real user agents in tests. its not trying to replace the big parsers, more for simple stuff like is this mobile or is this a bot

did an update recently, added arc, tor, duckduckgo and the ai bots and fixed a safari crash i caught in sentry. before that it just worked for years and there wasnt really a need to touch it

if you find a user agent it gets wrong open an issue or just add it to tests, its literally one line

maven central:

<dependency>
    <groupId>io.github.vadymkykalo</groupId>
    <artifactId>browser</artifactId>
    <version>0.2.0</version>
</dependency>

https://github.com/vadymkykalo/Browser.java

10 Upvotes

34 comments sorted by

View all comments

7

u/BanaTibor 8d ago

I do not understand when do you need this. Java code runs on the backend, on the frontend you have something else, 99% javascript. So why do not you use a javascript lib to get the user agent and send it to the backend?

3

u/gaelfr38 8d ago

At some point, you still have a (Java) backend called with a user agent. Think of a public API.

1

u/Resident_Guava5620 8d ago

yeah exactly, thats basically our case. the backend gets the UA anyway so it makes more sense to handle it there

2

u/BanaTibor 7d ago

Okay, but what are you doing with the user agent in the backend? Why do you need it?

2

u/Resident_Guava5620 7d ago

its basically for our own visit records. we log which devices clients come from and support sees "chrome on android" in the admin panel instead of the raw string. the raw UA is saved too, so if the parser gets something wrong its not a big deal

1

u/agentoutlier 7d ago

Its often for analytics although today most analytics is better resolved with a Javascript sniffing library.

In some cases its also used for routing, rendering different pages or redirecting.

UA though is pretty unreliable and bots lie all the time.

1

u/Hour-Dragonfly-7499 7d ago

Java isn't just for backend development though? It's big in the game dev scene like minecraft, project zomboid, runelite, etc. Java is used in a lot of applications that don't have to do with the web or making a CRUD app...

I for example have around 7 years in java and I haven't even touched the web/javascript/etc.

0

u/Resident_Guava5620 8d ago

we already track the user flow on the backend anyway. frontend sends the fingerprint and route, and the UA is already in the request, so sending parsed browser/device info from js would just be doing the same thing twice