java-使用filter检查远程地址

检测Web应用程序是否在本地访问的最佳方法是什么?
我有兴趣在filterjavax.servlet.Filter )中检查它。
我可以检查ServletRequest#getRemoteAddr()如果它是127.0.0.1但如果它在IPv6机器上运行,则地址将为0:0:0:0:0:0:0:1
是否还有其他陷阱我应该注意,或者如果我只检查这两个字符串模式,我会没事的?

谢谢

从理论上讲,以下内容应该足够了。

 if (request.getRemoteAddr().equals(request.getLocalAddr())) { // Locally accessed. } else { // Remotely accessed. } 


根据注释更新request.getLocalAddr()似乎返回0.0.0.0 ,当服务器在代理后面时确实会发生这种情况。

您可能希望将其与InetAddress解析的地址进行比较。

 private Set localAddresses = new HashSet(); @Override public void init(FilterConfig config) throws ServletException { try { localAddresses.add(InetAddress.getLocalHost().getHostAddress()); for (InetAddress inetAddress : InetAddress.getAllByName("localhost")) { localAddresses.add(inetAddress.getHostAddress()); } } catch (IOException e) { throw new ServletException("Unable to lookup local addresses"); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { if (localAddresses.contains(request.getRemoteAddr())) { // Locally accessed. } else { // Remotely accessed. } } 

在我的例子中, localAddresses包含以下内容:

 [192.168.1.101, 0:0:0:0:0:0:0:1, 127.0.0.1] 

您还需要检查盒子的所有其他IP地址,就像您的以太网接口一样。 还要考虑别名。

即使客户端在本地运行,它也可能没有使用环回接口。 您的计算机将具有分配的IP地址,并且取决于/ etc / hosts配置,DNS配置等,您连接的IP地址可能不是环回地址。

假设您想提供某种“更加安全”的“增强”接口,因为它源自同一台机器,请注意甚至可以使用wireshark等工具来窥探环回接口。 如果此接口旨在显示适合更受信任的客户端的数据,那么您应该努力通过https进行正确的ssl隧道传输。