检测Web应用程序是否在本地访问的最佳方法是什么?
我有兴趣在过滤器(javax.servlet.Filter
)中查看此内容
我可以检查ServletRequest#getRemoteAddr()
是否为127.0.0.1
,但如果它在IPv6计算机上运行,则地址为0:0:0:0:0:0:0:1
。
是否还有其他陷阱我应该注意,或者如果我只检查这两个字符串模式,我会没事的?
由于
答案 0 :(得分: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 :(得分:1)
您还需要检查盒子的所有其他IP地址,就像您的以太网接口一样。还要考虑别名。
答案 2 :(得分:1)
即使客户端在本地运行,它也可能没有使用环回接口。您的计算机将具有分配的IP地址,并且取决于/ etc / hosts配置,DNS配置等,您连接的IP地址可能不是环回地址。
假设您想提供某种“更加安全”的“增强”接口,因为它源自同一台机器,请注意甚至可以使用wireshark等工具来窥探环回接口。如果此接口旨在显示适合更受信任的客户端的数据,那么您应该努力通过https进行正确的ssl隧道传输。