java-使用过滤器检查远程地址

时间:2011-02-15 20:59:12

标签: java web-applications tomcat java-ee servlet-filters

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

由于

3 个答案:

答案 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隧道传输。