2016-11-17 4 views
0

Viele Leute fragen, wie man de IP von der Client-Seite ändern kann, aber ich muss es tun (wenn es möglich ist) von der Server-Seite.Wie kann ich IP in HttpServletRequest von der Serverseite ändern?

Die Sache ist, dass ich die IP von der HttpServletRequest.getRemoteAddr(), aber jetzt, dass wir einen Proxy vor unserem IHS verwenden, kommt diese IP immer mit der Proxy-IP, nicht die echte Client-IP.

Der Proxy stellt die reale IP in einem neuen spezifischen Header in der Anforderung bereit.

Ok, ich weiß, dass es einfach klingt, ich ändere nur die Art und Weise, wie ich die IP bekomme und bekomme es aus dem spezifischen Header, den der Proxy bietet. Es ist eine gute Lösung, das Problem ist, dass wir viele Klassen ändern müssen und ich denke auf eine andere mögliche Art, zum Beispiel, diese IP einmal mit der echten in der Anfrage in einer BaseClass zu ändern und dann alle (wer erweitert die BaseClass) erhält die IP korrekt aktualisiert.

Also, kann ich das irgendwie machen?

+0

es wahrscheinlich die Servlet-Spezifikation verletzen würde, aber man konnte es wih ein 'Filter' tun und ein' HttpServletRequestWrapper' die 'getRemoteAddr()' overrode. Die eigentliche Frage ist, warum haben Sie so viel Code, der an der Client-IP-Adresse interessiert ist? Es geht um eine Web-App. Sie sollten versuchen, diese Abhängigkeit auf längere Sicht zu beseitigen. – EJP

Antwort

0

Sie müssen einen Filter hinzufügen, der HttpServletRequestWrapper erstellt. Passen Sie den Implementierungsdeskriptor

Die Parts:

  • ProxyFilter
  • ProxyRequestWrapper
  • web.xml
  • ServletBehindProxy

Die 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 

    } 
} 

Die 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()); 
    } 

} 

es zu testen, konnte man Verwenden Sie die ModifyHeaders Browser-Plugin:

enter image description here

Verwandte Themen