2016-11-17 267 views
0

很多人会问如何从客户端更改de IP,但我需要从服务器端进行(如果可能的话)。如何从服务器端更改HttpServletRequest中的IP?

问题是我从HttpServletRequest.getRemoteAddr()获得IP,但现在我们在IHS之前使用了一个代理服务器,这个IP总是带有代理IP,而不是真正的客户端IP。

代理在请求中的新特定标题中提供真实IP。

好吧,我知道这听起来很容易,我只是改变了我获得IP的方式,并从代理提供的特定标题中获取它。这是一个很好的解决方案,问题是我们必须改变很多类,并且以另一种可能的方式思考,例如,使用BaseClass中的请求中的真实IP改变一次IP,然后每个人扩展BaseClass)获得正确更新的IP。

那么,我能以某种方式做到这一点吗?

+0

这可能会违反Servlet规范,但你可以做到这一点王氏一个'Filter'和'HttpServletRequestWrapper'是推翻'的getRemoteAddr()'。真正的问题是为什么你有很多对客户端IP地址感兴趣的代码?这是一个Web应用程序没有适当的关注。你应该期待从长远来看消除这种依赖。 – EJP

回答

0

您需要添加一个创建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浏览器的插件:

enter image description here