Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get user’s IP address, and other client-side info in Vaadin 7 web app

Tags:

vaadin

vaadin7

In Vaadin 7, how does one get the IP address of the user’s computer/device?

Can I get other information about the client?

like image 897
Basil Bourque Avatar asked Mar 03 '15 04:03

Basil Bourque


1 Answers

Vaadin WebBrowser

The WebBrowser class in Vaadin 7 provides an easy way to access information about the client’s computing environment. Access a WebBrowser object via the current Page object.

WebBrowser webBrowser = Page.getCurrent().getWebBrowser();

IP Address

The getAddress method provides the apparent IP address of the client computer/device.

String ipAddress = webBrowser.getAddress();
if ( ipAddress == null ) {
    // If null, this Vaadin app is probably running inside a portlet.
}

Other Client Info

The WebBrowser class can easily tell you much information about the client.

Examples: if the client is a Mac or a touch device (pad or phone), which browser engine (Safari, Chrome, Firefox, and such), if TLS is engaged (HTTPS), screen size, time zone & Daylight Saving Time, locale, and more. There is even a method to tell you if the web browser is too old to work well with Vaadin.

HTTP / Servlet

You could get this client-side info by going through the HTTP Request information via the standard Java Servlet calls. But Vaadin’s WebBrowser class described above is more convenient.

Example Code

Here is some actual code from my own app, shown here as an example. This may not be beautiful or ideal code, but it gives you an idea about how to look over the fence to the client web browser’s environment.

Some of the date-time work uses the Joda-Time library, as the only dependency for this code.

Get the standard Servlet session identifier via some convenience classes ( VaadinSession and WrappedSession ) provided by Vaadin.

String sessionId = VaadinSession.getCurrent().getSession().getId();  

Let's fetch and use that WebBrowser object.

WebBrowser webBrowser = Page.getCurrent().getWebBrowser();
// Environment stuff
String ipAddress = webBrowser.getAddress(); // May be null, especially if running in a Portlet.
String userAgentInfo = webBrowser.getBrowserApplication();
String touchDevice = String.valueOf( webBrowser.isTouchDevice() );
String screenSize = webBrowser.getScreenWidth() + "x" + webBrowser.getScreenHeight();
String locale = webBrowser.getLocale().toString();
String isHttps = String.valueOf( webBrowser.isSecureConnection() );
// Date-time stuff
DateTime serverNow = DateTime.now( DateTimeZone.UTC );
java.util.Date browserCurrentDate = webBrowser.getCurrentDate();
DateTime browserCurrentDateTime = new DateTime( browserCurrentDate , DateTimeZone.UTC );
String serverClientDifference = new Period( serverNow , browserCurrentDateTime ).toString();
int offset = webBrowser.getTimezoneOffset();
int rawOffset = webBrowser.getRawTimezoneOffset();
Boolean isInDst = webBrowser.isDSTInEffect();
int dst = webBrowser.getDSTSavings();
String timeDescription = "ClientNow→" + browserCurrentDateTime + "/ServerNow→" + serverNow + "/ServerClientDiff→" + serverClientDifference + "/OffsetFromUTC→" + offset + "/RawOffsetFromUTC→" + rawOffset + "/InDST→" + isInDst + "/DST→" + dst;

Create a string representation of all this info.

StringBuilder description = new StringBuilder();
description.append( "{ Account=" ).append( accountArg );  // Particular to my own app (login).
description.append( " | Username=" ).append( usernameArg );   // Particular to my own app (login).
description.append( " | SessionId=" ).append( sessionId );
description.append( " | IP_Address=" ).append( ipAddress );
description.append( " | HTTPS=" ).append( isHttps );
description.append( " | Locale=" ).append( locale );
description.append( " | TouchDevice=" ).append( touchDevice );
description.append( " | ScreenSize=" ).append( screenSize );
description.append( " | UserAgent=" ).append( userAgentInfo );
description.append( " | Time= " ).append( timeDescription );
description.append( " }" );

Example output:

{ Account= | Username= | SessionId=9309B2FA176D57F4D74CDC9E4E0238A8 | IP_Address=0:0:0:0:0:0:0:1 | HTTPS=false | Locale=en_US | TouchDevice=false | ScreenSize=1920x1080 | UserAgent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/600.3.18 (KHTML, like Gecko) Version/6.2.3 Safari/537.85.12 | Time= ClientNow→2015-03-03T21:11:25.664Z/ServerNow→2015-03-03T21:11:25.680Z/ServerClientDiff→PT-0.016S/OffsetFromUTC→-28800000/RawOffsetFromUTC→-28800000/InDST→false/DST→3600000 }

The observant reader may notice the IP Address was reported as IPv6 rather than the more usual IPv4. Already reported in Ticket # 8614.


For Vaadin apps before Vaadin 7, see this Forum thread.

like image 105
Basil Bourque Avatar answered Nov 14 '22 15:11

Basil Bourque