一尘不染

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

tomcat

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

谢谢


阅读 230

收藏
2020-06-16

共1个答案

一尘不染

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

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]
2020-06-16