我们计划将我们的UI代码与Spring restful apis分开,因为我们希望ui可以针对不同的客户进行定制。我们有一个rest api,它根据用户名和密码对用户进行身份验证。实际上在我的UI包中,我有一个spring控制器,它调用这个api来让用户通过spring RestTemplate进行身份验证,并根据结果返回适当的页面。如果有人提供错误的用户名密码三次,身份验证api将使用请求中的IP地址并阻止IP地址24小时。但问题是每次我调用这个api它都会获得我的服务器的IP地址,我的UI包被部署,我想这是正确的行为,因为调用者是我的UI服务器。那么我有没有办法在我的UI包上获取调用者的IP地址,并将其设置为我对我的api的请求。有没有办法可以在RestTemplate请求中设置实际的来电者IP。
答案 0 :(得分:1)
您可以使用 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();
}