servlet为什么只有同网络前缀的ip地址能访问

比如说,我的ip地址是196.168.3.20,我手机的ip地址是196.168.3.13,我的电脑和手机都能打开http://192.168.3.20:8080/servlet/Request这个链接。发给别人就打不开,这是为什么

public class RequestAPIServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的资源路径
        System.out.println("uri:"+req.getRequestURI());
        //获取请求的url
        System.out.println("url:"+req.getRequestURL());
        //获取客户端的IP地址
        System.out.println("客户端ip:"+req.getRemoteHost());
        //获取请求头
        System.out.println("请求头User-Agent:"+req.getHeader("User-Agent"));
    }
}

img

在局域网情况下,Servlet默认的注册地址是一个内网IP(类似192.168.1.23,10.84.55.1之类的),这样的话就限制了服务器的访问范围在同一局域网内,只有局域网内的地址可以访问Servlet。
解决办法:
1.租借一台有公网IP或者带端口映射域名的VPS,把Servlet放上去跑。优点是环境隔离,缺点是太贵。
2.内网穿透,把Servlet跑在本地,用内网穿透这个“桥梁”来让外网链接Servlet。优点是便宜(有许多免费的),缺点是带宽低不稳定。
3.问宽带运营商要静态IP,然后路由器层面做映射。优点是稳定,缺点是麻烦(根据我上海电信宽带这边的政策,普通家用没有静态IP,必须要至少每年万把块钱的公司光缆才可以)

你在中国,一个在美国的朋友问你借一支笔,你其实也没有笔,但你知道可以在同桌张三那里借到,张三告诉你:笔在我座位书包文具盒里,你自己去拿吧,于是你通过张三给的地址拿到了笔;于是你给你美国的朋友说:在张三座位书包文具盒里可以拿到笔;于是:
1.你美国的朋友并不认识张三,拿不到笔
2.你美国朋友正好也有一个叫张三的朋友,但是他没有文具盒,拿不到笔
3.你把张三的书包放到美国朋友的旁边,他拿到了笔
4.让你美国朋友在你这来指给他,他拿到了笔
5.通过国际中转,他拿到了笔

因为网络不同,你可以用花生壳来实现你的目的

之所以你能访问到,是因为你的电脑和手机处于局域网中(也就是同一个网段中),如果你发给你朋友,你朋友无法访问,因为你给它的地址是一个内网地址,在公网上是不能够直接访问内网地址的,解决方法可以通过内网穿透得到一个外网IP或域名,然后就可以通过这个IP或者域名进行访问了。

有帮助的,希望能够采纳支持一下,谢谢了!

说简单点就是你那几个设备处于局域网中,局域网中的设备可以相互访问,外面的设备无法访问到局域网中的设备,如果想要解决这个可以去了解一下内网穿透

因为你手机和电脑都连了同一个wifi,属于同一个局域网,外部ip是访问不了的。想要外部访问得部署在服务器上,使用外网访问。自己的电脑想实现要什么穿透,操作比较复杂。

您的这个问题和servlet访问IP限制没有关系,只要你的servlet能访问,也就是说正常启动了,就可以正常访问。
你的问题实际是一个网络问题,你的servlet部署在你电脑上,而你电脑和手机都是连接同一个路由器,在同一个局域网中,因此可以访问到。你的服务所在的网络没有开通公网,因此和外界是不通的,也就是你可以访问到外面的,但是外面的请求不会到达你的服务。要想让你朋友访问到,就要开通公网IP

网断不一样,不在同一个局域网内