我们目前有一个apache服务器将请求传递给运行我们的应用程序的JBoss服务器。在JBoss方面,在ContainerRequestFilter实现中,我获取了HttpServletRequest对象的句柄以获取远程地址(request.getRemoteAddr())。但是,返回的IP是Apache服务器的IP,而不是远程主机。
我知道我可以查看请求标头," x-forwarded-for"找到"真实" IP地址,但IP地址用于限制对我们应用程序中某些休息端点的访问。有人在这看到问题吗?快速欺骗x-forwarded-for标题和我在。
我的问题是:如何保留远程IP地址以限制对我们的端点的访问,而不是使用" x-forwarded-for"总而言之,因为它只是在等待被滥用?
这是我们缩写的apache配置文件:
<VirtualHost 192.168.42.60:80>
....
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://www.ourappaddress.com%{REQUEST_URI} [L,R]
...
</VirtualHost>
<VirtualHost 192.168.42.60:443>
ProxyPass / http://appserver:8080/app
ProxyPassReverse / http://appserver:8080/app
</VirtualHost>
这是简化的拦截器代码:
package com.ourcompany.interceptor;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import com.ourcompany.interceptor.annotation.IpRestricted;
@Provider @IpRestricted
public class IpInspector implements ContainerRequestFilter {
@Context
HttpServletRequest request;
@Override
public void filter(ContainerRequestContext containerRequestContext)
throws IOException {
String ip = request.getRemoteAddr(); // this gives me apache's IP, not remote IP!
if (!isIpAuthorized(ip)) {
containerRequestContext.abortWith(Response.ok("not authorized").build());
}
}