Forward a servlet request to another server

前端 未结 3 1258
半阙折子戏
半阙折子戏 2020-12-06 02:00

Java Servlet API can forward requests to another path within the same server (identical host:port). But, forwarding to a different host:port — like proxy do — is an

相关标签:
3条回答
  • 2020-12-06 02:35

    As far as I understand You need to send requests from Servlet and get response from other server into yours, may be you need a HTTP Client (Overview) for that.
    This question might also help you.

    0 讨论(0)
  • 2020-12-06 02:56

    You should use javax.net.HttpURLConnection

    Here is the psuedo code for that:

    URL url = new URL("http://otherserver:otherport/url");
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    
    // set http method if required
    connection.setRequestMethod("POST");
    
    // set request header if required
    connection.setRequestProperty("header1", "value1");
    
    // check status code
    if(connection.getResponseCode() == 200) {
    
       InputStream is = connection.getInputStream();
       //transfer is to the required output stream
    } else {
       //write error
    }
    
    0 讨论(0)
  • 2020-12-06 03:00

    HTTP-Proxy-Servlet does exactly what you need.

    Quick configuration

    pom.xml

    <dependency>
        <groupId>org.mitre.dsmiley.httpproxy</groupId>
        <artifactId>smiley-http-proxy-servlet</artifactId>
        <version>1.7</version>
    </dependency>
    

    web.xml

    <servlet>
        <servlet-name>solr</servlet-name>
        <servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
        <init-param>
            <param-name>targetUri</param-name>
            <param-value>http://solrserver:8983/solr</param-value>
        </init-param>
        <init-param>
            <param-name>log</param-name>
            <param-value>true</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>solr</servlet-name>
        <url-pattern>/solr/*</url-pattern>
    </servlet-mapping>
    

    Spring Integration

    see also: HTTP-Proxy-Servlet Issue #15

    pom.xml

    <dependency>
        <groupId>org.mitre.dsmiley.httpproxy</groupId>
        <artifactId>smiley-http-proxy-servlet</artifactId>
        <version>1.7</version>
    </dependency>
    

    ServletWrappingControllerExt.java

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.ServletWrappingController;
    
    public class ServletWrappingControllerExt extends ServletWrappingController
    {
        private String  pathToStrip;
    
        public void setPathToStrip(String pathToStrip)
        {
            this.pathToStrip = pathToStrip;
        }
    
        @Override
        protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
                throws Exception
        {
            final HttpServletRequest wrapper = new HttpServletRequestWrapper(request)
            {
                @Override
                public String getPathInfo()
                {
                    //Please note that getPathInfo returns null if DispatcherServlet is configured to track url-pattern "/"
                    //It should be configured to track url-pattern "/*". Below is a sample DispatcherServlet configuration
                    /*
                        <servlet>
                            <servlet-name>spring</servlet-name>
                            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                            <load-on-startup>1</load-on-startup>
                        </servlet>
                        <servlet-mapping>
                            <servlet-name>spring</servlet-name>
                            <url-pattern>/*</url-pattern>
                        </servlet-mapping>
                     */
                    String path = super.getPathInfo();                  
                    if (path.startsWith(pathToStrip))
                    {
                        final int length = pathToStrip.length();
                        path = path.substring(length);
                    }
                    return path;
                }
                
                @Override
                public String getServletPath()
                {
                    return super.getServletPath();
                }
            };
    
            return super.handleRequestInternal(wrapper, response);
        }
    }
    

    Beans configuration

    <bean id="myServletWrapper" class="ServletWrappingControllerExt">
        <property name="pathToStrip" value="/solr"/>
        <property name="servletClass" value="org.mitre.dsmiley.httpproxy.ProxyServlet" />
        <property name="servletName" value="solr" />
        <property name="initParameters">
            <props>
                <prop key="targetUri">http://solrserver:8983/solr</prop>
                <prop key="log">true</prop>
            </props>
        </property>
    </bean>
    
    <bean id="myServletUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
        <map>
            <entry key="/solr/**" value-ref="myServletWrapper" />
        </map>
        </property>
        <property name="order" value="1" />
    </bean>
    
    0 讨论(0)
提交回复
热议问题