2011-02-15 60 views
6

什么是检测Web应用程序本地访问的最佳方法?
我有兴趣在过滤器javax.servlet.Filter)中检查此项。
如果它是127.0.0.1,我可以检查ServletRequest#getRemoteAddr(),但如果它在IPv6机器中运行,则地址将为0:0:0:0:0:0:0:1
是否还有其他陷阱我应该知道,或者如果我只是检查这2个字符串模式,我会好吗?java-使用过滤器来检查远程地址

感谢

回答

11

理论上,下面应该足够了。

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


更新按照意见,request.getLocalAddr()似乎返回0.0.0.0当服务器位于代理这的确可以发生。

您可以改为将其与InetAddress解决的地址进行比较。

private Set<String> localAddresses = new HashSet<String>(); 

@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] 
1

你还需要检查你的机器的所有其他IP位址样的以太网接口之一。还要考虑别名。

+0

@Heico:你的意思是让所有的注册接口的机器?然后与远程地址进行比较?本质上是 – Cratylus 2011-02-15 21:21:08

+0

。客户端与服务器连接的网络路径可以包括其任何活动网络接口,它不必是本地主机。 – jwenting 2011-02-16 12:37:08

+0

我打开了所有界面,但“127.0.0.1”不在集合中! – Cratylus 2011-02-17 19:07:01

1

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

假设您想要提供某种“更安全”的“增强”接口,因为它起源于同一台计算机,请注意,甚至可以使用wireshark等工具来窥探环回接口。如果此接口旨在显示适合更可信的客户端的数据,那么可能性很大,您应该努力通过https进行适当的SSL隧道。