java - 如何在Spring RestTemplate中发送调用者的IP地址

标签 java rest spring-mvc resttemplate

我们计划将 UI 代码与 Spring Restful api 分离,因为我们希望为不同的客户定制 ui。我们有一个 REST API,它可以根据提供的用户名和密码对用户进行身份验证。实际上,在我的 UI 包中,我有一个 spring Controller ,它调用此 api 来让用户使用 spring RestTemplate 进行身份验证,并根据结果返回适当的页面。身份验证 API 使用请求中的 IP 地址,如果有人提供错误的用户名密码 3 次,该 IP 地址将被阻止 24 小时。但问题是每次我调用这个 api 时,它都会获取部署了我的 UI 包的服务器的 IP 地址,我猜这是正确的行为,因为调用者是我的 UI 服务器。那么有没有一种方法可以在我的 UI 包上获取调用者的 IP 地址并将其设置为我向 api 发出的请求。有没有办法可以在 RestTemplate 请求中设置实际调用者的 IP。

最佳答案

您可以使用HttpServletRequest来完成此操作,您的api方法应该为HttpServletRequest定义参数。

您的 api 方法应如下所示:

 @RequestMapping(value = "/myApiPath", method = RequestMethod.GET)
          public void myApiMethod(MyObject myobject, final HttpServletRequest request) throws IOException {
                String ipAddress=getIpAddressOfRequest(request); // get Ip address
          }

然后使用HttpServletRequest请求获取IP地址,如下:

public static String getIpAddressOfRequest(final HttpServletRequest request) {
            String remoteAddr = "";
            if (request != null) {
                remoteAddr = request.getHeader("X-FORWARDED-FOR");
                if (remoteAddr == null || "".equals(remoteAddr)) {
                    remoteAddr = request.getRemoteAddr();
                }
            }
            return remoteAddr;
      }

甚至您可以通过使用以下代码获取服务器名称来确定域名条件:

public static String getProtocolHostnameAndPort(final HttpServletRequest request) {
            String protocol = request.getProtocol().split("/")[0].toLowerCase();
            String hostname = request.getServerName();
            int port = request.getServerPort();
            StringBuilder result = new StringBuilder(protocol + "://" + hostname);
            if (port != 80) {
                  result.append(":").append(port);
            }
            return result.toString();
      }

关于java - 如何在Spring RestTemplate中发送调用者的IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46053424/

相关文章:

javascript - org.springframework.web.bind.MissingServletRequestParameterException : Required Long parameter 'userId' is not present"错误

java - Bean名称'loginDetails'的BindingResult或普通目标对象都不能用作请求属性

java - 为什么调用服务器上的 php 文件不起作用?

asp.net - 如何从正在使用的REST API(ServiceStack)中获取URI

rest - 文档数据库 : Can't access documents in my collection

java - 保存成功后无法更新

java - Jsoup, '>' 的问题相关转换

java - 它到达 if 语句并停止工作,我做错了什么(java 新手)

使用 Apache commons 库的 Java 命令行参数解析问题

python - 如何对 Django Rest 框架请求进行单元测试?