我们计划将 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/