您需要添加一个创建HttpServletRequestWrapper的过滤器。调整部署描述符。
的零件:
- ProxyFilter
- ProxyRequestWrapper
- 的web.xml
- ServletBehindProxy
的ProxyFilter:
package testingThings.wrapperAndFilter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Filter implementation class ProxyFilter
*/
public class ProxyFilter implements Filter {
/**
* Default constructor.
*/
public ProxyFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// delegate to the Http related doFilter method
doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);
}
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
// create a wrapper
ProxyRequestWrapper replacementRequest = new ProxyRequestWrapper(request);
// pass the request along the filter chain
chain.doFilter(replacementRequest, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
的ProxyRequestWrapper:
package testingThings.wrapperAndFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class ProxyRequestWrapper extends HttpServletRequestWrapper {
public ProxyRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getRemoteAddr() {
return getHeader("REAL-IP");
}
}
的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<filter>
<filter-name>ProxyFilter</filter-name>
<filter-class>testingThings.wrapperAndFilter.ProxyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ProxyFilter</filter-name>
<url-pattern>/ServletBehindProxy</url-pattern>
</filter-mapping>
</web-app>
ServletBehindProxy:
package testingThings.wrapperAndFilter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletBehindProxy
*/
@WebServlet("/ServletBehindProxy")
public class ServletBehindProxy extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// show ip
resp.getWriter().append(req.getRemoteAddr());
}
}
为了测试它,你可以使用ModifyHeaders浏览器的插件:
这可能会违反Servlet规范,但你可以做到这一点王氏一个'Filter'和'HttpServletRequestWrapper'是推翻'的getRemoteAddr()'。真正的问题是为什么你有很多对客户端IP地址感兴趣的代码?这是一个Web应用程序没有适当的关注。你应该期待从长远来看消除这种依赖。 – EJP