当前位置: 首页 > 知识库问答 >
问题:

如何在Spring MVC控制器get call中提取IP地址?

仲俊豪
2023-03-14

我正在从事Spring MVC控制器项目,在该项目中,我正在从浏览器中进行GET URL调用-

下面是我在浏览器中进行GET调用的url-

http://127.0.0.1:8080/testweb/processing?workflow=test&conf=20140324&dc=all

下面是点击浏览器后调用的代码-

@RequestMapping(value = "processing", method = RequestMethod.GET)
public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow,
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc) {

        System.out.println(workflow);
        System.out.println(value);
        System.out.println(dc);

        // some other code
    }

问题陈述:-

现在有什么方法,我可以从一些标头中提取IP地址吗?意思是我想知道从哪个IP地址,呼叫来了,意思是谁在上面调用URL,我需要知道他们的IP地址。这可能吗?

共有3个答案

鲁辉
2023-03-14

我用这样的方法来做这件事

public class HttpReqRespUtils {

    private static final String[] IP_HEADER_CANDIDATES = {
        "X-Forwarded-For",
        "Proxy-Client-IP",
        "WL-Proxy-Client-IP",
        "HTTP_X_FORWARDED_FOR",
        "HTTP_X_FORWARDED",
        "HTTP_X_CLUSTER_CLIENT_IP",
        "HTTP_CLIENT_IP",
        "HTTP_FORWARDED_FOR",
        "HTTP_FORWARDED",
        "HTTP_VIA",
        "REMOTE_ADDR"
    };

    public static String getClientIpAddressIfServletRequestExist() {

        if (RequestContextHolder.getRequestAttributes() == null) {
            return "0.0.0.0";
        }

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        for (String header: IP_HEADER_CANDIDATES) {
            String ipList = request.getHeader(header);
            if (ipList != null && ipList.length() != 0 && !"unknown".equalsIgnoreCase(ipList)) {
                String ip = ipList.split(",")[0];
                return ip;
            }
        }

        return request.getRemoteAddr();
    }
}
司徒捷
2023-03-14

我来晚了,但这可能有助于寻找答案。通常servletRequest。getRemoteAddr()工作正常。

在许多情况下,您的应用程序用户可能通过代理服务器访问您的web服务器,或者您的应用程序位于负载平衡器之后。

因此,在这种情况下,您应该访问X-Forwarded-For-http标头以获取用户的IP地址。

String ipAddress=request.getHeader("X-FORWARDED-FOR");

希望这有帮助。

刘乐童
2023-03-14

解决方案是

@RequestMapping(value = "processing", method = RequestMethod.GET)
public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow,
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc, HttpServletRequest request) {

        System.out.println(workflow);
        System.out.println(value);
        System.out.println(dc);
        System.out.println(request.getRemoteAddr());
        // some other code
    }

HttpServletRequest添加到您的方法定义中,然后使用Servlet API

Spring文档在这里说

15.3.2.3支持的处理程序方法参数和返回类型

Handler methods that are annotated with @RequestMapping can have very flexible signatures.
Most of them can be used in arbitrary order (see below for more details).

Request or response objects (Servlet API). Choose any specific request or response type,
for example ServletRequest or HttpServletRequest
 类似资料:
  • 当Unix上的Python脚本出现错误时,会发送一封电子邮件。 如果IP地址192.168.100.37是测试服务器,我被要求将{测试环境}添加到电子邮件的主题行。这样我们就可以有一个版本的脚本和一种方法来判断电子邮件是否来自测试服务器上混乱的数据。 然而,当我在谷歌上搜索时,我一直在寻找以下代码: 然而,这给了我127.0.1.1的IP地址。当我使用时,我得到了这个 首先,我不知道它是从哪里12

  • 我想使用@SessionAttributes注释在SpringMVC中的两个控制器之间共享会话属性。 下面是我用来测试属性共享的一个简单代码:AController。JAVA a.jsp BController.java b.jsp 我期望的行为是转到 /aURL,myParam将被设置为0到99之间的随机值,然后该值将在两个控制器之间共享。 但是,会发生以下情况:我转到/a URL,myPara

  • Python标准库的< code >套接字方法有一个源地址选项,用于控制连接使用哪个源IP。 给定一台有多个地址的机器,我如何使用Python ZeroMQ套接字做同样的事情? 在这种情况下,我一直在使用Linux的iproute2 ip addr 地址和ZeroMQ 套接字原型。

  • 问题内容: 我想获取计算机的IP地址。我使用了下面的代码,但是返回了。 我想获取IP地址(例如),而不是回送地址。 问题答案: 您需要遍历所有网络接口 播放(取自util / helper.go)

  • 问题内容: 我不是指 127.0.0.1 而是其他计算机将用来访问该计算机的计算机,例如 192.168.1.6 问题答案: http://nodejs.org/api/os.html#os_os_networkinterfaces

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?