【问题标题】:How can I change IP in HttpServletRequest from server side?如何从服务器端更改 HttpServletRequest 中的 IP?
【发布时间】:2017-04-01 16:44:07
【问题描述】:

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

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

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

好的,我知道这听起来很简单,我只是更改了获取 IP 的方式,并从 Proxy 提供的特定 Header 中获取它。这是一个很好的解决方案,问题是我们必须更改很多类,我正在考虑另一种可能的方式,例如,用 BaseClass 中的请求中的真实 IP 更改一次这个 IP,然后每个人(谁扩展 BaseClass) 正确更新 IP。

那么,我可以这样做吗?

【问题讨论】:

  • 它可能会违反 Servlet 规范,但您可以使用 Filter 和覆盖 getRemoteAddr()HttpServletRequestWrapper 来做到这一点。真正的问题是为什么你有这么多对客户端 IP 地址感兴趣的代码?对于网络应用程序来说,这不是适当的问题。从长远来看,您应该寻求消除这种依赖关系。

标签: java servlets proxy request ip


【解决方案1】:

您需要添加一个过滤器来创建 HttpServletRequestWrapper。调整部署描述符。

零件:

  • 代理过滤器
  • ProxyRequestWrapper
  • web.xml
  • ServletBehindProxy

代理过滤器:

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 Browser-Plugin:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-09
    • 2015-10-17
    • 2011-08-28
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多