检测Web应用程序是否在本地访问的最佳方法是什么? 我有兴趣在 过滤器 (javax.servlet.Filter)中对此进行检查。 我可以检查ServletRequest#getRemoteAddr()是否存在,127.0.0.1但是如果它在IPv6机器中运行,则地址为0:0:0:0:0:0:0:1。 还有其他我应该注意的陷阱吗?或者,如果仅检查这两个字符串模式,我会没事吗?
javax.servlet.Filter
ServletRequest#getRemoteAddr()
127.0.0.1
0:0:0:0:0:0:0:1
谢谢
从理论上讲,以下内容应足够。
if (request.getRemoteAddr().equals(request.getLocalAddr())) { // Locally accessed. } else { // Remotely accessed. }
*根据评论 *更新 ,request.getLocalAddr()似乎返回0.0.0.0,当服务器位于代理后面时确实可能发生。
request.getLocalAddr()
0.0.0.0
您可能需要将其与解析的地址进行比较InetAddress。
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包含以下内容:
localAddresses
[192.168.1.101, 0:0:0:0:0:0:0:1, 127.0.0.1]