现如今,微服务项目异常火爆,在系统开发过程中微服务在获取客户端ip的时候如何获取真实的ip地址呢?
下面分享一种通过修改请求头的方式把客户端ip传递到Next Service
1、在zuul网关项目中增加一个filter,代码如下
import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import javax.servlet.http.HttpServletRequest;import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;import org.springframework.stereotype.Component;@Componentpublic class ForwardedForFilter extends ZuulFilter { private static final String HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR"; public static final String UNKNOWN_CHAR = "unknown"; @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String remoteAddr = getIpAddress(request); ctx.getZuulRequestHeaders().put(HTTP_X_FORWARDED_FOR, remoteAddr); return null; } @Override public boolean shouldFilter() { return true; } @Override public String filterType() { return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { return 0; } public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("HTTP_X_FORWARDED_FOR"); if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getHeader("x-forwarded-for"); } if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } public static boolean isEmpty(CharSequence cs) { return cs == null || cs.length() == 0; }}为了方便手机格式上文章的浏览,特截图一张

这样在网关路由到的服务里面我们就可以获取到这个客户端真实ip了,代码如下
public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("HTTP_X_FORWARDED_FOR"); if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getHeader("x-forwarded-for"); } if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if(isEmpty(ip) || UNKNOWN_CHAR.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip;}以上方法是为了稳妥起见,你可以可以直接
String ip = request.getHeader("HTTP_X_FORWARDED_FOR");这样,你获取到的就是客户端真实的ip了,如果不这么改造的话,你获取到的可能是网关服务器所在的ip,如果你有更好的方式,欢迎留言。
版权声明:本文为weixin_39525313原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。