在 Vaadin 7 Web 应用程序中获取用户的 IP 地址和其他客户端信息

2024-02-26

In Vaadin https://www.Vaadin.com/7、如何获得IP地址 http://en.wikipedia.org/wiki/IP_address用户的计算机/设备?

我可以获得有关客户的其他信息吗?


Vaadin WebBrowser

The WebBrowser https://vaadin.com/api/com/vaadin/server/WebBrowser.htmlVaadin 7 中的类提供了一种简单的方法来访问有关客户端计算环境的信息。访问一个WebBrowser通过当前对象Page https://vaadin.com/api/com/vaadin/server/Page.html object.

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

IP地址

The getAddress https://vaadin.com/api/com/vaadin/server/WebBrowser.html#getAddress()方法提供客户端计算机/设备的明显 IP 地址。

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

其他客户信息

The WebBrowser类可以很容易地告诉你有关客户的很多信息。

示例:如果客户端是 Mac 或触摸设备(平板电脑或手机),则使用哪个浏览器引擎(Safari、Chrome、Firefox 等),如果TLS http://en.wikipedia.org/wiki/Transport_Layer_Security是否启用 (HTTPS)、屏幕尺寸、时区和夏令时、区域设置等。甚至还有一种方法可以告诉您是否Web 浏览器太旧,无法与 Vaadin 配合使用 https://vaadin.com/api/com/vaadin/server/WebBrowser.html#isTooOldToFunctionProperly().

HTTP / 服务程序

您可以通过以下方式获取此客户端信息HTTP请求 http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_message通过标准的信息Java小服务程序 http://en.wikipedia.org/wiki/Java_servlet来电。但瓦丁的WebBrowser上面描述的类比较方便。

示例代码

这是我自己的应用程序中的一些实际代码,此处作为示例显示。这可能不是漂亮或理想的代码,但它让您了解如何越过栅栏查看客户端 Web 浏览器环境。

一些日期时间工作使用乔达时间 http://www.joda.org/joda-time/库,作为此代码的唯一依赖项。

通过一些便利类获取标准 Servlet 会话标识符(VaadinSession https://vaadin.com/api/com/vaadin/server/VaadinSession.html and WrappedSession https://vaadin.com/api/com/vaadin/server/WrappedSession.html)由瓦丁提供。

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

让我们获取并使用它WebBrowser https://vaadin.com/api/com/vaadin/server/WebBrowser.html 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;

创建所有这些信息的字符串表示形式。

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( " }" );

输出示例:

{ 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 }

细心的读者可能会注意到 IP 地址被报告为IPv6 https://en.wikipedia.org/wiki/IPv6而不是更常见的IPv4 https://en.wikipedia.org/wiki/IPv4。已经报道了票号#8614 http://dev.vaadin.com/ticket/8614.


对于 Vaadin 7 之前的 Vaadin 应用程序,请参阅这个论坛帖子 https://vaadin.com/forum/#!/thread/19302/1097518.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Vaadin 7 Web 应用程序中获取用户的 IP 地址和其他客户端信息 的相关文章

随机推荐

  • Delphi性能:读取数据集中某个字段下的所有值

    我们正在尝试找出一些从 TADOQuery 读取的性能修复程序 目前 我们使用 while not Q eof do begin Q next 方法循环记录 对于每条记录 我们读取每条记录的 ID 和值 并将每条记录添加到组合框列表中 有没
  • 滚动视图内部滚动视图

    我知道 Google 的人要求我们不要将 Scrollable 视图放入另一个 Scrollable 视图中 但是他们有任何官方声明指示我们不要这样做吗 试试这个 Note Here parentScrollView意味着外层ScrollV
  • Pos() 在 utf8 字符串边界内

    我希望有一个 Pos 适合用于指定源字符串内的边界 而不是让它在整个数据中执行搜索 假设我有一个 100 个字符长的字符串 我只想在 unicode utf8 字符串的第 5 个和第 20 个字符之间执行 Pos 该代码应该改编自 delp
  • MySQL - 如何在 INSERT 语句中将字符串值解析为 DATETIME 格式?

    我有一个MySQL database 其中有一列是日期类型DATETIME 我从外部应用程序获取日期 时间的字符串值 该字符串值如下所示 5 15 2012 8 06 26 AM MySQL 在 INSERT 上抛出错误 Error Inc
  • System.IO.IOException CreateHostBuilder(args).Build().Run() 中的“功能未实现”

    当我开始在 Linux Docker 容器中调试我的应用程序时 在调用时出现异常CreateHostBuilder args Build 该代码是一个相当新的 AspASP NET Core MVC 3 1 项目的一部分 I saw the
  • Nexus 存储库 3 备份

    最近我安装了Nexus 存储库 3在 OpenStack Cloud 中 我已经使用它一段时间了 我想对 Nexus 执行增量备份 从而保护我们的数据 如何对 Nexus 数据进行增量备份 Nexus 备份的过程描述于文档 https he
  • 使用负年份创建 Instant

    我正在尝试创建一个Instant基于公元前公历中的年份 这是我到目前为止所拥有的 Instant FromDateTimeOffset new DateTimeOffset 1000 10 01 0 0 0 0 new System Glo
  • SwiftUI 中带有背景图像的透明导航栏

    我有一个自定义导航栏 它是一个图像 后跟标题文本 图像设置为缩放以填充 但没有完全填满导航栏 因此 您可以看到图像未覆盖的一小部分条形 我尝试将导航栏的背景颜色设置为清除 但这不起作用 有什么建议么 struct ContentView V
  • 如何通过 GPS 检查距 x,y 位置 10 米的半径

    我从 GPS 得到这个位置 40 715192 74 005795 如何判断i是否在10米半径范围内 提前致谢 使用半正矢公式http en wikipedia org wiki Haversine formula http en wiki
  • 将 yuv 序列转换为 bmp 图像

    我有 yuv 序列 我想将它们转换为 bmp 图像 我想将其保存到我的计算机上的文件夹中 我使用了 yuv2bmp m 文件这个链接 http www mathworks com matlabcentral fileexchange 255
  • 数据库 - 为什么不区分大小写?

    我看到一两个线程在全球范围内讨论区分大小写 但我的问题更具体 例如 我理解对文本值不区分大小写的搜索的兴趣 但为什么我们要使用不区分大小写的数据库名称 表和列呢 难道不会导致错误吗 使用数据库的脚本语言都是区分大小写的 因此 例如 如果我们
  • MS Graph Java SDK:如何将大文件上传到 OneDrive?

    我正在尝试从 Java 应用程序将文件上传到 OneDrive 但我不了解流程 也没有在 SKD 中看到任何用于文件上传的文档或方法 我发现的唯一流程是 driveClient me drive root createUploadSessi
  • 如何获取 DShellFolderViewEvents 的方法签名

    我试图沉沦DShellFolderViewEvents使用 ATL 我能够成功订阅的唯一方法是DISPID SELECTIONCHANGED 标题中似乎列出了许多其他事件shdispid h 但我无法让他们开火 不确定我做错了什么 可能与
  • Blogger Javascript 在帖子 > 500 上出现 JSON 错误

    我想向我的博主展示随机帖子 我从谷歌搜索得到了一个 javascript 并尝试了它 但是随机帖子的数量不正确 应该是 10 但有时是 4 有时是 2 等等 我尝试检查发生了什么 发现 json feed entry 500 抛出错误 这是
  • 为什么Restlet无法注册JSON转换器?

    我在这里束手无策 似乎从来没有遇到过这个问题 我发现设置快速 HelloWorld 应用程序以确保 Restlet 2 0 启动并运行相对容易 然而 我面临着一个我以前从未遇到过的奇怪异常 我的类路径和 WEB INF lib 文件夹中都有
  • g++:错误:libgomp.spec:没有这样的文件或目录

    我使用 g GCC 4 7 2 在 Windows 7 64 位版本上 下载自http nuwen net mingw html http nuwen net mingw html 我尝试使用 fopenmp 标志并收到错误 g 错误 li
  • Swagger/Swashbuckle 列出可接受的值?

    我已在 Web API 应用程序上成功实现了 Swashbuckle Swagger 但对输出并不满意 我的 Web api 方法之一 企业事件日志记录工具 接受复杂对象值的 JSON 对象 问题在于 当存在可以使用的可接受值的选定列表时
  • 在 Windows 上监听“使用我的 Java 应用程序打开文件”事件

    标题很混乱 但不知道如何用几句话来解释 我有一个读取 example 文件的 java 应用程序 我还添加了一个文件关联 感谢install4j因此 当用户双击任何扩展名为 example 的文件时 我的应用程序就会启动 看来 instal
  • 在 Python 脚本中以 Windows 上的不同用户(非管理员)身份运行程序

    使用以下代码 class ImpersonateWin32Sec object def init self domain username password self username username self password pass
  • 在 Vaadin 7 Web 应用程序中获取用户的 IP 地址和其他客户端信息

    In Vaadin https www Vaadin com 7 如何获得IP地址 http en wikipedia org wiki IP address用户的计算机 设备 我可以获得有关客户的其他信息吗 Vaadin WebBrows