什么是检测Web应用程序本地访问的最佳方法?
我有兴趣在过滤器(javax.servlet.Filter
)中检查此项。
如果它是127.0.0.1
,我可以检查ServletRequest#getRemoteAddr()
,但如果它在IPv6机器中运行,则地址将为0:0:0:0:0:0:0:1
。
是否还有其他陷阱我应该知道,或者如果我只是检查这2个字符串模式,我会好吗?java-使用过滤器来检查远程地址
感谢
什么是检测Web应用程序本地访问的最佳方法?
我有兴趣在过滤器(javax.servlet.Filter
)中检查此项。
如果它是127.0.0.1
,我可以检查ServletRequest#getRemoteAddr()
,但如果它在IPv6机器中运行,则地址将为0:0:0:0:0:0:0:1
。
是否还有其他陷阱我应该知道,或者如果我只是检查这2个字符串模式,我会好吗?java-使用过滤器来检查远程地址
感谢
理论上,下面应该足够了。
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]
你还需要检查你的机器的所有其他IP位址样的以太网接口之一。还要考虑别名。
即使客户端在本地运行,它也可能没有使用回送接口。您的计算机具有分配的IP地址的可能性很大,并且取决于/ etc/hosts配置,DNS配置等,您连接的IP地址可能不是回送地址。
假设您想要提供某种“更安全”的“增强”接口,因为它起源于同一台计算机,请注意,甚至可以使用wireshark等工具来窥探环回接口。如果此接口旨在显示适合更可信的客户端的数据,那么可能性很大,您应该努力通过https进行适当的SSL隧道。
@Heico:你的意思是让所有的注册接口的机器?然后与远程地址进行比较?本质上是 – Cratylus 2011-02-15 21:21:08
。客户端与服务器连接的网络路径可以包括其任何活动网络接口,它不必是本地主机。 – jwenting 2011-02-16 12:37:08
我打开了所有界面,但“127.0.0.1”不在集合中! – Cratylus 2011-02-17 19:07:01