HttpServletRequest.getRemoteAddr() returning wrong address [duplicate]
We need to log the client's IP address from a Seam action. Currently, we're using the code:
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest)context.getRequest();
this.remoteAddress = request.getRemoteAddr();
However, this seems to be always returning an internal address of our network, rather than the client's IP address. From my research, it seems that having a reverse proxy in the network can confuse things, but we might be able to fix it by reconfiguring our web servers. Has anyone else had this problem, and how did you solve it?
We're using JBoss 5.1 app servers and Apache web servers. Thanks!
You can 'see through' a proxy and get the address of the original requestor from the X-FORWARDED-FOR
header using
request.getHeader( "X-FORWARDED-FOR" );
I guess a misbehaving proxy between the original requestor and your server could result in the true value being lost.
Ref: wikipedia description of X-FORWARDED-FOR
What you need is for your reverse proxy to pass the original IP address in a special header, like x-forwarded-for
. You can then retrieve this header from your servlet. Additionally, you may want to modify your log file to log this IP address. Example:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="access_log." suffix=".txt"
fileDateFormat="yyyy-MM-dd"
pattern="%{x-forwarded-for}i %l - %t "%r" %s %b "%{referer}i" "%{user-agent}i""
resolveHosts="false"/>
精彩评论