`

Tomcat Servlet request.getRemoteAddr()所得值为0:0:0:0:0:0:0:1

 
阅读更多
环境:

tomcat5.6

JSP

UTF-8

IP协议:IPv4,IPv6

服务器和访问者在同一机器上。


问题描述

上传文件时,为了避免文件名重复,打算利用IP地址+时间戳的方式和给文件命名。但是,从本机上访问本机服务器时,利用request.getRemoteAddr()函数获取IP地址,得到的是0:0:0:0:0:0:0:1。因为是按IPv4的方式和解析的,所以使得保存文件失败。

[b]原因及解决方案[/b]

因为机器上启用的IPv6协议,所以在对localhost进DNS解析时,得到的是IPv6形式的本机地址0:0:0:0:0:0:0:1。因此在利用http://localhost:8080/demo/ 访问时,request.getRemoteAddr()函数才会得到上面的结果。
可以修改hosts文件。位置:C:\Windows\System32\drivers\etc。添加上一句127.0.0.1       localhost,这样request.getRemoteAddr()函数得到的将是127.0.0.1。
此外,利用别的机器来访问本机服务器,则不会出现上述上问题,能够取得它的IPv4地址。对于网上所说的因为tomcat的反向代理,使得request.getRemoteAddr()无法获得客户端真实IP的问题,我目前还不是很理解。

关于hosts文件

hosts文件相当于一个位于本地的IP地址到域名的映射文件,可以提供DNS解析。如果想访问的网站被域名污染(域名劫持),可以预先将IP,域名对写入hosts文件。

public static String getAddressIP(HttpServletRequest request) {
      String ipAddress = null;
      ipAddress = request.getHeader("x-forwarded-for");
      if (ipAddress == null || ipAddress.length() == 0
          || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("Proxy-Client-IP");
      }
      if (ipAddress == null || ipAddress.length() == 0
          || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("WL-Proxy-Client-IP");
      }
      if (ipAddress == null || ipAddress.length() == 0
          || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getRemoteAddr();
        if (ipAddress.equals("127.0.0.1")) {
          // Based on the IP network card in the machine configuration
          InetAddress inet = null;
          try {
            inet = InetAddress.getLocalHost();
          } catch (UnknownHostException e) {
            e.printStackTrace();
          }
          ipAddress = inet.getHostAddress();
        }
      
      }
      
      // In the case of through multiple agents, 
      // the first real IP IP for the client, 
      // multiple IP in accordance with the ', 'segmentation
      if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
                                                          // = 15
        if (ipAddress.indexOf(",") > 0) {
          ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
        }
      }
      
      return ipAddress;
    }

分享到:
评论

相关推荐

    JSP获取HTTP header信息(request)例子

    - `request.getRemoteAddr()`: 返回发起请求的客户端IP地址。 - `request.getRemoteHost()`: 返回发起请求的客户端主机名。 2. **编码与内容信息** - `request.getCharacterEncoding()`: 返回请求的字符编码集...

    javaweb,标签库,函数库,数据库连接池实例借鉴.pdf

    - `request.getRemoteAddr()`:获取客户端IP。 - `request.getServerName()`:获取服务器名称。 - `request.getServerPort()`:获取服务器端口号。 - `request.getScheme()`:获取协议名,如HTTP或HTTPS。 - `...

    Java Web应用开发 19 课堂案例-全面认识request的常用方法.docx

    在Java Web应用开发中,`HttpServletRequest`对象,通常简称为`request`,是Servlet API中的一个核心接口,用于封装客户端的HTTP请求信息。本案例旨在深入理解并掌握`request`对象的各种常用方法及其应用场景。以下...

    sevlet生命周期,request web.xml 及ServletContext总结

    当Servlet容器(如Tomcat、Jetty等)启动时,或者当容器首次接收到需要特定Servlet服务的请求时,Servlet类会被加载并实例化。如果在`web.xml`配置文件中,Servlet被标记为`load-on-startup`,那么它会在容器启动时...

    web开发技术总复习题[汇编].pdf

    11. 获取表单信息:request对象的getParameter方法(选项A)用于获取表单特定字段的值。 12. response对象:response对象(选项A)负责向客户端发送数据,对用户的请求做出响应。 13. 会话期:会话从访问者打开...

    request的实例源码

    System.out.println("请求参数1:" + param1); System.out.println("请求参数2的值:" + Arrays.toString(param2Values)); System.out.println("Content-Type请求头:" + contentType); System.out.println(...

    javaWEB总结(6):ServletRequest

    在Java Web开发中,Servlet API是核心组件之一,它提供了处理HTTP请求和响应的方法。...在实际项目中,结合Servlet容器如Tomcat,我们可以利用这些方法来解析和响应客户端的请求,实现服务器端的功能逻辑。

    jsp开发讲义

    Tomcat是一款免费开源的Servlet容器,它支持Java Servlet以及JSP技术。 ##### Tomcat的安装与配置 1. **下载与安装** 下载最新版本的Tomcat并解压到指定路径。 2. **环境变量配置** - 设置`CATALINA_HOME`: ...

    JavaEE面试笔试问答题.docx

    11. **获取IP地址**:在JSP中,可以使用`<%= request.getRemoteAddr() %>`来获取客户端IP。 12. **Session**:存储用户特定的持久信息,创建时调用`session = request.getSession();`,赋值`session.setAttribute(...

    idea,java获取ip地址

    1. **配置Servlet**:首先,在IntelliJ IDEA中创建一个Java Web项目,然后添加Servlet类。继承`javax.servlet.http.HttpServlet`,并在`doGet`或`doPost`方法中处理请求。 ```java import javax.servlet....

    java 70个问答

    - Servlet容器(如Tomcat)会在第一次请求Servlet时加载该Servlet,或者按照部署描述符中的配置来决定加载时机。 25. **后续知识点补充:** - 接下来的内容未能完整提供,但从前面的内容可以看出,涉及了Java ...

    filter过滤器流程及中文乱码解决和客户端IP地址控制

    String remoteIP = request.getRemoteAddr(); if (remoteIP.equals(rejectedIP)) { // 如果请求的IP与拒绝的IP相同,重定向到错误页面 RequestDispatcher dispatcher = request.getRequestDispatcher(...

    servlet+cookie和Session

    Servlet容器(如Tomcat)负责加载和运行Servlet,当特定请求到达时,容器会实例化Servlet类并调用其中的方法,如`doGet`或`doPost`,来处理请求并生成应答。 Servlet的生命周期包括以下几个阶段: 1. **初始化**:...

    用servlet编写的网站计算器

    - 加载和实例化:当第一个请求到达时,Servlet容器(如Tomcat)加载Servlet类并创建一个实例。 - 初始化:Servlet实例创建后,`init()`方法会被调用,这里可以进行一次性配置或初始化工作。 - 服务:每当收到请求...

    Java中request对象常用方法汇总

    1. `getHeader(String name)`:根据指定的头部名称,返回第一个匹配的请求头的值。如果不存在,则返回`null`。 2. `getHeaders(String name)`:返回一个`Enumeration<String>`,包含所有匹配指定头部名称的值。如果...

    day14_servlet&http&request_java_httprequestservlet_milejfl_

    1. **Servlet基础**: - **Servlet接口**:Servlet是Java Servlet API中的核心接口,它定义了一个服务器端程序,可以响应来自客户端(通常是浏览器)的请求。Servlet生命周期包括初始化、服务、销毁三个阶段。 - *...

    javaweb,标签库,函数库,数据库连接池实例分享.pdf

    `request.getRemoteAddr()`返回客户端IP,`request.getServerName()`和`request.getServerPort()`分别提供服务器名称和端口号,`request.getScheme()`和`request.getProtocol()`给出协议名称和版本,`request....

    笔试JSP1.doc

    在 JSP 中,可以使用 `request.getRemoteAddr()` 方法获取访问者的 IP 地址。 5. forward 和 redirect forward 和 redirect 是两种不同的页面跳转机制: * forward:在服务器端跳转,客户端不知道跳转的过程 * ...

    获得访问者的IP地址

    在Java Servlet中,我们可以使用`HttpServletRequest`接口的`getRemoteAddr()`方法来获取客户端的IP地址。例如: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws...

    jsp文件上传功能的实现

    String remoteAddr = request.getRemoteAddr(); // 获得服务器的名字 String serverName = request.getServerName(); // 取得互联网程序的绝对地址 String realPath = request.getRealPath(serverName); ...

Global site tag (gtag.js) - Google Analytics